From 774bc61f4db2d1de4786eaf0b6c3c5b53caccf0d Mon Sep 17 00:00:00 2001 From: dxyinme Date: Thu, 30 Mar 2023 22:25:00 +0800 Subject: [PATCH 01/27] update --- dcron.go | 4 ++++ driver/driver.go | 6 ++++++ driver/v2/etcddriver.go | 1 + driver/v2/redisclusterdriver.go | 1 + driver/v2/redisdriver.go | 4 ++++ node_pool.go | 6 ------ 6 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 driver/v2/etcddriver.go create mode 100644 driver/v2/redisclusterdriver.go create mode 100644 driver/v2/redisdriver.go diff --git a/dcron.go b/dcron.go index 907e5b5..3ed68fd 100644 --- a/dcron.go +++ b/dcron.go @@ -177,6 +177,10 @@ func (d *Dcron) Start() { // Run Job func (d *Dcron) Run() { + // recover jobs before starting + if d.RecoverFunc != nil { + d.RecoverFunc(d) + } if atomic.CompareAndSwapInt32(&d.running, dcronStopped, dcronRunning) { if err := d.startNodePool(); err != nil { atomic.StoreInt32(&d.running, dcronStopped) diff --git a/driver/driver.go b/driver/driver.go index 8b44ce7..db62c84 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -16,3 +16,9 @@ type Driver interface { GetServiceNodeList(ServiceName string) ([]string, error) RegisterServiceNode(ServiceName string) (string, error) } + +type DriverV2 interface { + Init(serviceName string, timeout time.Duration, logger dlog.Logger) + GetServiceNodeList() ([]string, error) + Start() error +} diff --git a/driver/v2/etcddriver.go b/driver/v2/etcddriver.go new file mode 100644 index 0000000..5ec3cc8 --- /dev/null +++ b/driver/v2/etcddriver.go @@ -0,0 +1 @@ +package v2 diff --git a/driver/v2/redisclusterdriver.go b/driver/v2/redisclusterdriver.go new file mode 100644 index 0000000..5ec3cc8 --- /dev/null +++ b/driver/v2/redisclusterdriver.go @@ -0,0 +1 @@ +package v2 diff --git a/driver/v2/redisdriver.go b/driver/v2/redisdriver.go new file mode 100644 index 0000000..0675a5e --- /dev/null +++ b/driver/v2/redisdriver.go @@ -0,0 +1,4 @@ +package v2 + +type RedisDriver struct { +} diff --git a/node_pool.go b/node_pool.go index 6667dca..f263ea0 100644 --- a/node_pool.go +++ b/node_pool.go @@ -26,12 +26,6 @@ type NodePool struct { } func newNodePool(serverName string, driver driver.Driver, dcron *Dcron, updateDuration time.Duration, hashReplicas int) (*NodePool, error) { - - err := driver.Ping() - if err != nil { - return nil, err - } - nodePool := &NodePool{ Driver: driver, serviceName: serverName, From bca24cd125ba62373e3431fd05a2936190b77775 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Mon, 3 Apr 2023 22:37:18 +0800 Subject: [PATCH 02/27] update redis driver --- driver/v2/redisdriver.go | 80 ++++++++++++++++++++++++++++++++++++++++ driver/v2/util.go | 22 +++++++++++ 2 files changed, 102 insertions(+) create mode 100644 driver/v2/util.go diff --git a/driver/v2/redisdriver.go b/driver/v2/redisdriver.go index 0675a5e..52ddc86 100644 --- a/driver/v2/redisdriver.go +++ b/driver/v2/redisdriver.go @@ -1,4 +1,84 @@ package v2 +import ( + "context" + "fmt" + "log" + "time" + + "github.com/go-redis/redis/v8" + "github.com/libi/dcron/dlog" +) + type RedisDriver struct { + c *redis.Client + serviceName string + nodeID string + timeout time.Duration + logger dlog.Logger +} + +func NewRedisDriver(redisClient *redis.Client) *RedisDriver { + return &RedisDriver{ + c: redisClient, + logger: &dlog.StdLogger{ + Log: log.Default(), + }, + } +} + +func (rd *RedisDriver) Init(serviceName string, timeout time.Duration, logger dlog.Logger) { + rd.serviceName = serviceName + rd.timeout = timeout + if logger != nil { + rd.logger = logger + } + rd.nodeID = GetNodeId(rd.serviceName) +} + +func (rd *RedisDriver) GetServiceNodeList() (nodesList []string, err error) { + mathStr := fmt.Sprintf("%s*", GetKeyPre(rd.serviceName)) + return rd.scan(mathStr) +} + +func (rd *RedisDriver) Start() (err error) { + err = rd.registerServiceNode() + go rd.heartBeat() + return +} + +// private function + +func (rd *RedisDriver) heartBeat() { + tick := time.NewTicker(rd.timeout / 2) + for range tick.C { + keyExist, err := rd.c.Expire(context.Background(), rd.nodeID, rd.timeout).Result() + if err != nil { + rd.logger.Errorf("redis expire error %+v", err) + continue + } + if !keyExist { + if err := rd.registerServiceNode(); err != nil { + rd.logger.Errorf("register service node error %+v", err) + } + } + } +} + +func (rd *RedisDriver) registerServiceNode() error { + return rd.c.SetEX(context.Background(), rd.nodeID, rd.nodeID, rd.timeout).Err() +} + +func (rd *RedisDriver) scan(matchStr string) ([]string, error) { + ret := make([]string, 0) + ctx := context.Background() + iter := rd.c.Scan(ctx, 0, matchStr, -1).Iterator() + for iter.Next(ctx) { + err := iter.Err() + if err != nil { + return nil, err + } + ret = append(ret, iter.Val()) + } + return ret, nil } diff --git a/driver/v2/util.go b/driver/v2/util.go new file mode 100644 index 0000000..206f3dd --- /dev/null +++ b/driver/v2/util.go @@ -0,0 +1,22 @@ +package v2 + +import "github.com/google/uuid" + +// GlobalKeyPrefix is global redis key preifx +const GlobalKeyPrefix = "distributed-cron:" + +func GetKeyPre(serviceName string) string { + return GlobalKeyPrefix + serviceName + ":" +} + +func GetNodeId(serviceName string) string { + return GetKeyPre(serviceName) + uuid.New().String() +} + +func GetStableJobStore(serviceName string) string { + return GetKeyPre(serviceName) + "stable-jobs" +} + +func GetStableJobStoreTxKey(serviceName string) string { + return GetKeyPre(serviceName) + "TX:stable-jobs" +} From 2260b5f126831238cb5b2b86b84d28be8efa9de8 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Tue, 4 Apr 2023 22:34:14 +0800 Subject: [PATCH 03/27] update --- driver/driver.go | 3 +-- driver/v2/redisdriver.go | 49 +++++++++++++++++++++++++++++++++------- driver/v2/util.go | 14 ++++++++++++ 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/driver/driver.go b/driver/driver.go index db62c84..23599ab 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -19,6 +19,5 @@ type Driver interface { type DriverV2 interface { Init(serviceName string, timeout time.Duration, logger dlog.Logger) - GetServiceNodeList() ([]string, error) - Start() error + Start() (nodesChan chan []string, err error) } diff --git a/driver/v2/redisdriver.go b/driver/v2/redisdriver.go index 52ddc86..19ec8e0 100644 --- a/driver/v2/redisdriver.go +++ b/driver/v2/redisdriver.go @@ -4,10 +4,12 @@ import ( "context" "fmt" "log" + "sort" "time" "github.com/go-redis/redis/v8" "github.com/libi/dcron/dlog" + "github.com/libi/dcron/driver" ) type RedisDriver struct { @@ -16,14 +18,18 @@ type RedisDriver struct { nodeID string timeout time.Duration logger dlog.Logger + nodesChan chan []string + prevNodes []string } -func NewRedisDriver(redisClient *redis.Client) *RedisDriver { +func NewRedisDriver(redisClient *redis.Client) driver.DriverV2 { return &RedisDriver{ c: redisClient, logger: &dlog.StdLogger{ Log: log.Default(), }, + nodesChan: make(chan []string, DefaultNodesChanLength), + prevNodes: make([]string, 0), } } @@ -36,19 +42,41 @@ func (rd *RedisDriver) Init(serviceName string, timeout time.Duration, logger dl rd.nodeID = GetNodeId(rd.serviceName) } -func (rd *RedisDriver) GetServiceNodeList() (nodesList []string, err error) { - mathStr := fmt.Sprintf("%s*", GetKeyPre(rd.serviceName)) - return rd.scan(mathStr) -} - -func (rd *RedisDriver) Start() (err error) { +func (rd *RedisDriver) Start() (nodesChan chan []string, err error) { + // register err = rd.registerServiceNode() + // heartbeat timer go rd.heartBeat() - return + // update service nodes + rd.updateNodes() + // go update timer. + go rd.updateNodesTimer() + return rd.nodesChan, err } // private function +func (rd *RedisDriver) updateNodesTimer() { + tick := time.NewTicker(rd.timeout / 2) + for range tick.C { + rd.updateNodes() + } +} + +func (rd *RedisDriver) updateNodes() { + nowNodes, err := rd.getServiceNodeList() + if err != nil { + rd.logger.Errorf("get service node list err, err=%v", err) + return + } + sort.Strings(nowNodes) + if EqualStringSlice(rd.prevNodes, nowNodes) { + return + } + rd.prevNodes = nowNodes + rd.nodesChan <- rd.prevNodes +} + func (rd *RedisDriver) heartBeat() { tick := time.NewTicker(rd.timeout / 2) for range tick.C { @@ -82,3 +110,8 @@ func (rd *RedisDriver) scan(matchStr string) ([]string, error) { } return ret, nil } + +func (rd *RedisDriver) getServiceNodeList() (nodesList []string, err error) { + mathStr := fmt.Sprintf("%s*", GetKeyPre(rd.serviceName)) + return rd.scan(mathStr) +} diff --git a/driver/v2/util.go b/driver/v2/util.go index 206f3dd..cea68d0 100644 --- a/driver/v2/util.go +++ b/driver/v2/util.go @@ -4,6 +4,7 @@ import "github.com/google/uuid" // GlobalKeyPrefix is global redis key preifx const GlobalKeyPrefix = "distributed-cron:" +const DefaultNodesChanLength = 10 func GetKeyPre(serviceName string) string { return GlobalKeyPrefix + serviceName + ":" @@ -20,3 +21,16 @@ func GetStableJobStore(serviceName string) string { func GetStableJobStoreTxKey(serviceName string) string { return GetKeyPre(serviceName) + "TX:stable-jobs" } + +func EqualStringSlice(a []string, b []string) bool { + if len(a) == len(b) { + la := len(a) + for i := 0; i < la; i++ { + if a[i] != b[i] { + return false + } + } + return true + } + return false +} From b90a81e2f68b0dd01e3ba4bcffe4296bfbfb3986 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Wed, 5 Apr 2023 19:07:50 +0800 Subject: [PATCH 04/27] update --- dcron.go | 27 ++------ dcron_test.go | 43 +++++++------ driver/driver.go | 3 +- driver/v2/redisdriver.go | 3 +- examples/example/example.go | 31 +++------ examples/stablejob/stablejob.go | 8 +-- node_pool.go | 107 ++++++++++++++++---------------- 7 files changed, 96 insertions(+), 126 deletions(-) diff --git a/dcron.go b/dcron.go index 3ed68fd..24abcff 100644 --- a/dcron.go +++ b/dcron.go @@ -47,34 +47,24 @@ type Dcron struct { } // NewDcron create a Dcron -func NewDcron(serverName string, driver driver.Driver, cronOpts ...cron.Option) *Dcron { +func NewDcron(serverName string, driver driver.DriverV2, cronOpts ...cron.Option) *Dcron { dcron := newDcron(serverName) dcron.crOptions = cronOpts dcron.cr = cron.New(cronOpts...) dcron.running = dcronStopped - var err error - dcron.nodePool, err = newNodePool(serverName, driver, dcron, dcron.nodeUpdateDuration, dcron.hashReplicas) - if err != nil { - dcron.logger.Errorf("ERR: %s", err.Error()) - return nil - } + dcron.nodePool = newNodePool(serverName, driver, dcron.nodeUpdateDuration, dcron.hashReplicas, dcron.logger) return dcron } // NewDcronWithOption create a Dcron with Dcron Option -func NewDcronWithOption(serverName string, driver driver.Driver, dcronOpts ...Option) *Dcron { +func NewDcronWithOption(serverName string, driver driver.DriverV2, dcronOpts ...Option) *Dcron { dcron := newDcron(serverName) for _, opt := range dcronOpts { opt(dcron) } dcron.cr = cron.New(dcron.crOptions...) - var err error - dcron.nodePool, err = newNodePool(serverName, driver, dcron, dcron.nodeUpdateDuration, dcron.hashReplicas) - if err != nil { - dcron.logger.Errorf("ERR: %s", err.Error()) - return nil - } + dcron.nodePool = newNodePool(serverName, driver, dcron.nodeUpdateDuration, dcron.hashReplicas, dcron.logger) return dcron } @@ -147,13 +137,7 @@ func (d *Dcron) Remove(jobName string) { } func (d *Dcron) allowThisNodeRun(jobName string) bool { - allowRunNode := d.nodePool.PickNodeByJobName(jobName) - d.logger.Infof("job '%s' running in node %s", jobName, allowRunNode) - if allowRunNode == "" { - d.logger.Errorf("node pool is empty") - return false - } - return d.nodePool.NodeID == allowRunNode + return d.nodePool.CheckJobAvailable(jobName) } // Start job @@ -212,4 +196,5 @@ func (d *Dcron) Stop() { return } } + d.nodePool.Close() } diff --git a/dcron_test.go b/dcron_test.go index 8a8acfc..6751c1a 100644 --- a/dcron_test.go +++ b/dcron_test.go @@ -10,7 +10,7 @@ import ( "github.com/go-redis/redis/v8" "github.com/libi/dcron" "github.com/libi/dcron/dlog" - RedisDriver "github.com/libi/dcron/driver/redis" + v2 "github.com/libi/dcron/driver/v2" "github.com/robfig/cron/v3" ) @@ -25,26 +25,23 @@ func (t TestJob1) Run() { var testData = make(map[string]struct{}) func Test(t *testing.T) { - drv, err := RedisDriver.NewDriver(&redis.Options{ - Addr: "127.0.0.1:6379", - }) - - if err != nil { - t.Error(err) - } - - go runNode(t, drv) + go runNode(t) // 间隔1秒启动测试节点刷新逻辑 time.Sleep(time.Second) - go runNode(t, drv) + go runNode(t) time.Sleep(time.Second * 2) - go runNode(t, drv) + go runNode(t) //add recover - dcron2 := dcron.NewDcron("server2", drv, cron.WithChain(cron.Recover(cron.DefaultLogger))) + redisCli2 := redis.NewClient(&redis.Options{ + Addr: "127.0.0.1:6379", + }) + drv2 := v2.NewRedisDriver(redisCli2) + dcron2 := dcron.NewDcron("server2", drv2, cron.WithChain(cron.Recover(cron.DefaultLogger))) dcron2.Start() dcron2.Stop() + var err error //panic recover test err = dcron2.AddFunc("s2 test1", "* * * * *", func() { panic("panic test") @@ -74,7 +71,11 @@ func Test(t *testing.T) { rec := dcron.CronOptionChain(cron.Recover(cron.PrintfLogger(logger))) // option test - dcron3 := dcron.NewDcronWithOption("server3", drv, rec, + redisCli3 := redis.NewClient(&redis.Options{ + Addr: "127.0.0.1:6379", + }) + drv3 := v2.NewRedisDriver(redisCli3) + dcron3 := dcron.NewDcronWithOption("server3", drv3, rec, dcron.WithLogger(logger), dcron.WithHashReplicas(10), dcron.WithNodeUpdateDuration(time.Second*10)) @@ -109,7 +110,11 @@ func Test(t *testing.T) { dcron3.Stop() } -func runNode(t *testing.T, drv *RedisDriver.RedisDriver) { +func runNode(t *testing.T) { + redisCli := redis.NewClient(&redis.Options{ + Addr: "127.0.0.1:6379", + }) + drv := v2.NewRedisDriver(redisCli) dcron := dcron.NewDcron("server1", drv) //添加多个任务 启动多个节点时 任务会均匀分配给各个节点 @@ -150,14 +155,12 @@ func runNode(t *testing.T, drv *RedisDriver.RedisDriver) { } func Test_SecondsJob(t *testing.T) { - drv, err := RedisDriver.NewDriver(&redis.Options{ + redisCli := redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", }) - if err != nil { - t.Error(err) - } + drv := v2.NewRedisDriver(redisCli) dcr := dcron.NewDcronWithOption(t.Name(), drv, dcron.CronOptionSeconds()) - err = dcr.AddFunc("job1", "*/5 * * * * *", func() { + err := dcr.AddFunc("job1", "*/5 * * * * *", func() { t.Log(time.Now()) }) if err != nil { diff --git a/driver/driver.go b/driver/driver.go index 23599ab..9e88594 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -18,6 +18,7 @@ type Driver interface { } type DriverV2 interface { - Init(serviceName string, timeout time.Duration, logger dlog.Logger) + // init driver, return nodeID + Init(serviceName string, timeout time.Duration, logger dlog.Logger) (nodeID string) Start() (nodesChan chan []string, err error) } diff --git a/driver/v2/redisdriver.go b/driver/v2/redisdriver.go index 19ec8e0..ffaf40b 100644 --- a/driver/v2/redisdriver.go +++ b/driver/v2/redisdriver.go @@ -33,13 +33,14 @@ func NewRedisDriver(redisClient *redis.Client) driver.DriverV2 { } } -func (rd *RedisDriver) Init(serviceName string, timeout time.Duration, logger dlog.Logger) { +func (rd *RedisDriver) Init(serviceName string, timeout time.Duration, logger dlog.Logger) string { rd.serviceName = serviceName rd.timeout = timeout if logger != nil { rd.logger = logger } rd.nodeID = GetNodeId(rd.serviceName) + return rd.nodeID } func (rd *RedisDriver) Start() (nodesChan chan []string, err error) { diff --git a/examples/example/example.go b/examples/example/example.go index 7e7fd72..726e54c 100644 --- a/examples/example/example.go +++ b/examples/example/example.go @@ -1,7 +1,6 @@ package main import ( - "errors" "flag" "fmt" "log" @@ -13,10 +12,7 @@ import ( "github.com/google/uuid" "github.com/libi/dcron" "github.com/libi/dcron/dlog" - "github.com/libi/dcron/driver" - etcdDriver "github.com/libi/dcron/driver/etcd" - redisDriver "github.com/libi/dcron/driver/redis" - clientv3 "go.etcd.io/etcd/client/v3" + v2 "github.com/libi/dcron/driver/v2" ) const ( @@ -26,7 +22,6 @@ const ( var ( addr = flag.String("addr", "127.0.0.1:6379", "the addr of driver service") - driverType = flag.String("driver_type", "redis", "the driver type [redis/etcd]") serverName = flag.String("server_name", "server", "the server name of dcron in this process") subId = flag.String("sub_id", "1", "this process sub id in this server") jobNumber = flag.Int("jobnumber", 3, "there number of cron job") @@ -60,26 +55,14 @@ func (wj *WriteJob) Run() { } } -func getTheDriver() (driver.Driver, error) { - - if *driverType == DriverType_REDIS { - return redisDriver.NewDriver(&redis.Options{ - Addr: *addr, - }) - } else if *driverType == DriverType_ETCD { - return etcdDriver.NewEtcdDriver(&clientv3.Config{ - Endpoints: []string{*addr}, - }) - } - return nil, errors.New("driverType not suit") -} - func main() { flag.Parse() - driver, err := getTheDriver() - if err != nil { - panic(err) - } + var err error + + redisCli := redis.NewClient(&redis.Options{ + Addr: *addr, + }) + driver := v2.NewRedisDriver(redisCli) logger := &dlog.StdLogger{ Log: log.New(os.Stdout, "["+*subId+"]", log.LstdFlags), } diff --git a/examples/stablejob/stablejob.go b/examples/stablejob/stablejob.go index 6ef508a..4484bfd 100644 --- a/examples/stablejob/stablejob.go +++ b/examples/stablejob/stablejob.go @@ -9,7 +9,7 @@ import ( "github.com/go-redis/redis/v8" "github.com/libi/dcron" "github.com/libi/dcron/dlog" - redisDriver "github.com/libi/dcron/driver/redis" + v2 "github.com/libi/dcron/driver/v2" examplesCommon "github.com/libi/dcron/examples/common" ) @@ -45,10 +45,8 @@ func main() { Password: IEnv.RedisPassword, } - drv, err := redisDriver.NewDriver(redisOpts) - if err != nil { - logger.Fatal(err) - } + redisCli := redis.NewClient(redisOpts) + drv := v2.NewRedisDriver(redisCli) dcronInstance := dcron.NewDcronWithOption(IEnv.ServerName, drv, dcron.WithLogger(&dlog.StdLogger{ Log: logger, diff --git a/node_pool.go b/node_pool.go index f263ea0..cd3a8c7 100644 --- a/node_pool.go +++ b/node_pool.go @@ -1,11 +1,12 @@ package dcron import ( + "log" "sync" - "sync/atomic" "time" "github.com/libi/dcron/consistenthash" + "github.com/libi/dcron/dlog" "github.com/libi/dcron/driver" ) @@ -17,79 +18,77 @@ type NodePool struct { rwMut sync.RWMutex nodes *consistenthash.Map - Driver driver.Driver + driver driver.DriverV2 hashReplicas int hashFn consistenthash.Hash updateDuration time.Duration - dcron *Dcron + logger dlog.Logger + closeChan chan interface{} + nodesChan chan []string } -func newNodePool(serverName string, driver driver.Driver, dcron *Dcron, updateDuration time.Duration, hashReplicas int) (*NodePool, error) { - nodePool := &NodePool{ - Driver: driver, - serviceName: serverName, - dcron: dcron, +func newNodePool(serviceName string, driver driver.DriverV2, updateDuration time.Duration, hashReplicas int, logger dlog.Logger) *NodePool { + np := &NodePool{ + serviceName: serviceName, + driver: driver, hashReplicas: hashReplicas, updateDuration: updateDuration, + logger: &dlog.StdLogger{ + Log: log.Default(), + }, } - return nodePool, nil -} - -// StartPool Start Service Watch Pool -func (np *NodePool) StartPool() error { - var err error - np.Driver.SetTimeout(np.updateDuration) - np.NodeID, err = np.Driver.RegisterServiceNode(np.serviceName) - if err != nil { - return err - } - np.Driver.SetHeartBeat(np.NodeID) - - err = np.updatePool() - if err != nil { - return err + if logger != nil { + np.logger = logger } + np.NodeID = np.driver.Init(serviceName, updateDuration, np.logger) + return np +} - go np.tickerUpdatePool() - return nil +func (np *NodePool) StartPool() (err error) { + np.nodesChan, err = np.driver.Start() + go np.waitingForHashRing() + return } -func (np *NodePool) updatePool() error { - nodes, err := np.Driver.GetServiceNodeList(np.serviceName) - if err != nil { - return err +// Check if this job can be run in this node. +func (np *NodePool) CheckJobAvailable(jobName string) bool { + np.rwMut.RLock() + defer np.rwMut.RUnlock() + if np.nodes == nil { + np.logger.Errorf("nodeID=%s, np.nodes is nil", np.NodeID) } - - np.rwMut.Lock() - defer np.rwMut.Unlock() - np.nodes = consistenthash.New(np.hashReplicas, np.hashFn) - for _, node := range nodes { - np.nodes.Add(node) + if np.nodes.IsEmpty() { + return false + } + targetNode := np.nodes.Get(jobName) + if np.NodeID == targetNode { + np.logger.Infof("job %s, running in node: %s", jobName, targetNode) } - return nil + return np.NodeID == targetNode +} + +func (np *NodePool) Close() { + close(np.closeChan) } -func (np *NodePool) tickerUpdatePool() { - tickers := time.NewTicker(np.updateDuration) - for range tickers.C { - if atomic.LoadInt32(&np.dcron.running) == dcronRunning { - err := np.updatePool() - if err != nil { - np.dcron.logger.Infof("update node pool error %+v", err) - } - } else { - tickers.Stop() + +func (np *NodePool) waitingForHashRing() { + for { + select { + case nowNodes := <-np.nodesChan: + np.logger.Infof("update hashRing nowNodes=%+v", nowNodes) + np.updateHashRing(nowNodes) + case <-np.closeChan: return } } } -// PickNodeByJobName : 使用一致性hash算法根据任务名获取一个执行节点 -func (np *NodePool) PickNodeByJobName(jobName string) string { - np.rwMut.RLock() - defer np.rwMut.RUnlock() - if np.nodes.IsEmpty() { - return "" +func (np *NodePool) updateHashRing(nodes []string) { + np.rwMut.Lock() + defer np.rwMut.Unlock() + np.nodes = consistenthash.New(np.hashReplicas, np.hashFn) + for _, v := range nodes { + np.nodes.Add(v) } - return np.nodes.Get(jobName) } From 655e01206d3f4adfe2fd97b8a09b7cbde6fa5349 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Fri, 7 Apr 2023 22:47:40 +0800 Subject: [PATCH 05/27] update --- dcron.go | 4 +- dcron_test.go | 128 +++++++++++++++------------------------ driver/driver.go | 11 +++- driver/v2/redisdriver.go | 88 +++++++++++++-------------- driver/v2/util.go | 13 ---- node_pool.go | 56 ++++++++++++++--- 6 files changed, 148 insertions(+), 152 deletions(-) diff --git a/dcron.go b/dcron.go index 24abcff..08ae50b 100644 --- a/dcron.go +++ b/dcron.go @@ -15,7 +15,7 @@ import ( const ( defaultReplicas = 50 - defaultDuration = time.Second + defaultDuration = 10 * time.Second ) const ( @@ -196,5 +196,5 @@ func (d *Dcron) Stop() { return } } - d.nodePool.Close() + d.nodePool.Stop() } diff --git a/dcron_test.go b/dcron_test.go index 6751c1a..7e266ef 100644 --- a/dcron_test.go +++ b/dcron_test.go @@ -12,6 +12,11 @@ import ( "github.com/libi/dcron/dlog" v2 "github.com/libi/dcron/driver/v2" "github.com/robfig/cron/v3" + "github.com/stretchr/testify/require" +) + +const ( + DefaultRedisAddr = "127.0.0.1:6379" ) type TestJob1 struct { @@ -24,95 +29,19 @@ func (t TestJob1) Run() { var testData = make(map[string]struct{}) -func Test(t *testing.T) { +func TestMultiNodes(t *testing.T) { go runNode(t) // 间隔1秒启动测试节点刷新逻辑 time.Sleep(time.Second) go runNode(t) - time.Sleep(time.Second * 2) + time.Sleep(time.Second) go runNode(t) - - //add recover - redisCli2 := redis.NewClient(&redis.Options{ - Addr: "127.0.0.1:6379", - }) - drv2 := v2.NewRedisDriver(redisCli2) - dcron2 := dcron.NewDcron("server2", drv2, cron.WithChain(cron.Recover(cron.DefaultLogger))) - dcron2.Start() - dcron2.Stop() - - var err error - //panic recover test - err = dcron2.AddFunc("s2 test1", "* * * * *", func() { - panic("panic test") - }) - if err != nil { - t.Fatal("add func error") - } - err = dcron2.AddFunc("s2 test2", "* * * * *", func() { - t.Log("执行 service2 test2 任务", time.Now().Format("15:04:05")) - }) - if err != nil { - t.Fatal("add func error") - } - err = dcron2.AddFunc("s2 test3", "* * * * *", func() { - t.Log("执行 service2 test3 任务", time.Now().Format("15:04:05")) - }) - if err != nil { - t.Fatal("add func error") - } - dcron2.Start() - - // set logger - logger := &dlog.StdLogger{ - Log: log.New(os.Stdout, "[test_s3]", log.LstdFlags), - } - // wrap cron recover - rec := dcron.CronOptionChain(cron.Recover(cron.PrintfLogger(logger))) - - // option test - redisCli3 := redis.NewClient(&redis.Options{ - Addr: "127.0.0.1:6379", - }) - drv3 := v2.NewRedisDriver(redisCli3) - dcron3 := dcron.NewDcronWithOption("server3", drv3, rec, - dcron.WithLogger(logger), - dcron.WithHashReplicas(10), - dcron.WithNodeUpdateDuration(time.Second*10)) - - //panic recover test - err = dcron3.AddFunc("s3 test1", "* * * * *", func() { - t.Log("执行 server3 test1 任务,模拟 panic", time.Now().Format("15:04:05")) - panic("panic test") - }) - if err != nil { - t.Fatal("add func error") - } - - err = dcron3.AddFunc("s3 test2", "* * * * *", func() { - t.Log("执行 server3 test2 任务", time.Now().Format("15:04:05")) - }) - if err != nil { - t.Fatal("add func error") - } - err = dcron3.AddFunc("s3 test3", "* * * * *", func() { - t.Log("执行 server3 test3 任务", time.Now().Format("15:04:05")) - }) - if err != nil { - t.Fatal("add func error") - } - dcron3.Start() - - //测试120秒后退出 time.Sleep(120 * time.Second) - t.Log("testData", testData) - dcron2.Stop() - dcron3.Stop() } func runNode(t *testing.T) { redisCli := redis.NewClient(&redis.Options{ - Addr: "127.0.0.1:6379", + Addr: DefaultRedisAddr, }) drv := v2.NewRedisDriver(redisCli) dcron := dcron.NewDcron("server1", drv) @@ -156,7 +85,7 @@ func runNode(t *testing.T) { func Test_SecondsJob(t *testing.T) { redisCli := redis.NewClient(&redis.Options{ - Addr: "127.0.0.1:6379", + Addr: DefaultRedisAddr, }) drv := v2.NewRedisDriver(redisCli) dcr := dcron.NewDcronWithOption(t.Name(), drv, dcron.CronOptionSeconds()) @@ -170,3 +99,42 @@ func Test_SecondsJob(t *testing.T) { time.Sleep(15 * time.Second) dcr.Stop() } + +func runSecondNode(id string, t *testing.T) { + redisCli := redis.NewClient(&redis.Options{ + Addr: DefaultRedisAddr, + }) + drv := v2.NewRedisDriver(redisCli) + dcr := dcron.NewDcronWithOption(t.Name(), drv, + dcron.CronOptionSeconds(), + dcron.WithLogger(&dlog.StdLogger{ + Log: log.New(os.Stdout, "["+id+"]", log.LstdFlags), + }), + dcron.CronOptionChain(cron.Recover( + cron.DefaultLogger, + )), + ) + var err error + err = dcr.AddFunc("job1", "*/5 * * * * *", func() { + t.Log(time.Now()) + }) + require.Nil(t, err) + err = dcr.AddFunc("job2", "*/8 * * * * *", func() { + panic("test panic") + }) + require.Nil(t, err) + err = dcr.AddFunc("job3", "*/2 * * * * *", func() { + t.Log("job3:", time.Now()) + }) + require.Nil(t, err) + dcr.Start() +} + +func Test_SecondJobWithPanicAndMultiNodes(t *testing.T) { + go runSecondNode("1", t) + go runSecondNode("2", t) + go runSecondNode("3", t) + go runSecondNode("4", t) + go runSecondNode("5", t) + time.Sleep(45 * time.Second) +} diff --git a/driver/driver.go b/driver/driver.go index 9e88594..902f0d6 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -18,7 +18,12 @@ type Driver interface { } type DriverV2 interface { - // init driver, return nodeID - Init(serviceName string, timeout time.Duration, logger dlog.Logger) (nodeID string) - Start() (nodesChan chan []string, err error) + // init driver + Init(serviceName string, timeout time.Duration, logger dlog.Logger) + // get nodeID + NodeID() string + // get nodes + GetNodes() (nodes []string, err error) + Start() (err error) + Stop() (err error) } diff --git a/driver/v2/redisdriver.go b/driver/v2/redisdriver.go index ffaf40b..3b400b2 100644 --- a/driver/v2/redisdriver.go +++ b/driver/v2/redisdriver.go @@ -2,9 +2,10 @@ package v2 import ( "context" + "errors" "fmt" "log" - "sort" + "sync" "time" "github.com/go-redis/redis/v8" @@ -18,78 +19,82 @@ type RedisDriver struct { nodeID string timeout time.Duration logger dlog.Logger - nodesChan chan []string - prevNodes []string + started bool + stopChan chan interface{} + + sync.Mutex } func NewRedisDriver(redisClient *redis.Client) driver.DriverV2 { - return &RedisDriver{ + rd := &RedisDriver{ c: redisClient, logger: &dlog.StdLogger{ Log: log.Default(), }, - nodesChan: make(chan []string, DefaultNodesChanLength), - prevNodes: make([]string, 0), } + rd.started = false + return rd } -func (rd *RedisDriver) Init(serviceName string, timeout time.Duration, logger dlog.Logger) string { +func (rd *RedisDriver) Init(serviceName string, timeout time.Duration, logger dlog.Logger) { rd.serviceName = serviceName rd.timeout = timeout if logger != nil { rd.logger = logger } rd.nodeID = GetNodeId(rd.serviceName) +} + +func (rd *RedisDriver) NodeID() string { return rd.nodeID } -func (rd *RedisDriver) Start() (nodesChan chan []string, err error) { +func (rd *RedisDriver) Start() (err error) { + rd.Lock() + defer rd.Unlock() + if rd.started { + err = errors.New("this driver is started") + return + } + rd.stopChan = make(chan interface{}, 1) + rd.started = true // register err = rd.registerServiceNode() + if err != nil { + return + } // heartbeat timer go rd.heartBeat() - // update service nodes - rd.updateNodes() - // go update timer. - go rd.updateNodesTimer() - return rd.nodesChan, err + return } -// private function - -func (rd *RedisDriver) updateNodesTimer() { - tick := time.NewTicker(rd.timeout / 2) - for range tick.C { - rd.updateNodes() - } +func (rd *RedisDriver) Stop() (err error) { + rd.Lock() + defer rd.Unlock() + close(rd.stopChan) + return } -func (rd *RedisDriver) updateNodes() { - nowNodes, err := rd.getServiceNodeList() - if err != nil { - rd.logger.Errorf("get service node list err, err=%v", err) - return - } - sort.Strings(nowNodes) - if EqualStringSlice(rd.prevNodes, nowNodes) { - return - } - rd.prevNodes = nowNodes - rd.nodesChan <- rd.prevNodes +func (rd *RedisDriver) GetNodes() (nodes []string, err error) { + mathStr := fmt.Sprintf("%s*", GetKeyPre(rd.serviceName)) + return rd.scan(mathStr) } +// private function + func (rd *RedisDriver) heartBeat() { tick := time.NewTicker(rd.timeout / 2) - for range tick.C { - keyExist, err := rd.c.Expire(context.Background(), rd.nodeID, rd.timeout).Result() - if err != nil { - rd.logger.Errorf("redis expire error %+v", err) - continue - } - if !keyExist { + for { + select { + case <-tick.C: if err := rd.registerServiceNode(); err != nil { rd.logger.Errorf("register service node error %+v", err) } + case <-rd.stopChan: + if err := rd.c.Del(context.Background(), rd.nodeID, rd.nodeID).Err(); err != nil { + rd.logger.Errorf("unregister service node error %+v", err) + } + return } } } @@ -111,8 +116,3 @@ func (rd *RedisDriver) scan(matchStr string) ([]string, error) { } return ret, nil } - -func (rd *RedisDriver) getServiceNodeList() (nodesList []string, err error) { - mathStr := fmt.Sprintf("%s*", GetKeyPre(rd.serviceName)) - return rd.scan(mathStr) -} diff --git a/driver/v2/util.go b/driver/v2/util.go index cea68d0..cd1d427 100644 --- a/driver/v2/util.go +++ b/driver/v2/util.go @@ -21,16 +21,3 @@ func GetStableJobStore(serviceName string) string { func GetStableJobStoreTxKey(serviceName string) string { return GetKeyPre(serviceName) + "TX:stable-jobs" } - -func EqualStringSlice(a []string, b []string) bool { - if len(a) == len(b) { - la := len(a) - for i := 0; i < la; i++ { - if a[i] != b[i] { - return false - } - } - return true - } - return false -} diff --git a/node_pool.go b/node_pool.go index cd3a8c7..8e07ac6 100644 --- a/node_pool.go +++ b/node_pool.go @@ -23,9 +23,9 @@ type NodePool struct { hashFn consistenthash.Hash updateDuration time.Duration - logger dlog.Logger - closeChan chan interface{} - nodesChan chan []string + logger dlog.Logger + stopChan chan int + preNodes []string // sorted } func newNodePool(serviceName string, driver driver.DriverV2, updateDuration time.Duration, hashReplicas int, logger dlog.Logger) *NodePool { @@ -41,12 +41,23 @@ func newNodePool(serviceName string, driver driver.DriverV2, updateDuration time if logger != nil { np.logger = logger } - np.NodeID = np.driver.Init(serviceName, updateDuration, np.logger) + np.driver.Init(serviceName, updateDuration, np.logger) return np } func (np *NodePool) StartPool() (err error) { - np.nodesChan, err = np.driver.Start() + err = np.driver.Start() + if err != nil { + np.logger.Errorf("start pool error: %v", err) + return + } + np.NodeID = np.driver.NodeID() + nowNodes, err := np.driver.GetNodes() + if err != nil { + np.logger.Errorf("get nodes error: %v", err) + return + } + np.updateHashRing(nowNodes) go np.waitingForHashRing() return } @@ -68,17 +79,24 @@ func (np *NodePool) CheckJobAvailable(jobName string) bool { return np.NodeID == targetNode } -func (np *NodePool) Close() { - close(np.closeChan) +func (np *NodePool) Stop() { + np.stopChan <- 1 + np.driver.Stop() + np.preNodes = make([]string, 0) } func (np *NodePool) waitingForHashRing() { + tick := time.NewTicker(np.updateDuration) for { select { - case nowNodes := <-np.nodesChan: - np.logger.Infof("update hashRing nowNodes=%+v", nowNodes) + case <-tick.C: + nowNodes, err := np.driver.GetNodes() + if err != nil { + np.logger.Errorf("get nodes error %v", err) + continue + } np.updateHashRing(nowNodes) - case <-np.closeChan: + case <-np.stopChan: return } } @@ -87,8 +105,26 @@ func (np *NodePool) waitingForHashRing() { func (np *NodePool) updateHashRing(nodes []string) { np.rwMut.Lock() defer np.rwMut.Unlock() + if np.equalRing(nodes) { + return + } + np.logger.Infof("update hashRing nodes=%+v", nodes) + np.preNodes = nodes np.nodes = consistenthash.New(np.hashReplicas, np.hashFn) for _, v := range nodes { np.nodes.Add(v) } } + +func (np *NodePool) equalRing(a []string) bool { + if len(a) == len(np.preNodes) { + la := len(a) + for i := 0; i < la; i++ { + if a[i] != np.preNodes[i] { + return false + } + } + return true + } + return false +} From 0d8b44bc06b75d49d793c8efaf8c0127de81a0c7 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Sun, 9 Apr 2023 13:32:22 +0800 Subject: [PATCH 06/27] update --- dcron.go | 4 ++-- dcron_test.go | 28 +++++++++++++++++++++------- driver/v2/redisclusterdriver.go | 1 - node_pool.go | 5 ++++- 4 files changed, 27 insertions(+), 11 deletions(-) delete mode 100644 driver/v2/redisclusterdriver.go diff --git a/dcron.go b/dcron.go index 08ae50b..88a23c9 100644 --- a/dcron.go +++ b/dcron.go @@ -15,7 +15,7 @@ import ( const ( defaultReplicas = 50 - defaultDuration = 10 * time.Second + defaultDuration = 3 * time.Second ) const ( @@ -189,6 +189,7 @@ func (d *Dcron) startNodePool() error { // Stop job func (d *Dcron) Stop() { tick := time.NewTicker(time.Millisecond) + d.nodePool.Stop() for range tick.C { if atomic.CompareAndSwapInt32(&d.running, dcronRunning, dcronStopped) { d.cr.Stop() @@ -196,5 +197,4 @@ func (d *Dcron) Stop() { return } } - d.nodePool.Stop() } diff --git a/dcron_test.go b/dcron_test.go index 7e266ef..30a9d5e 100644 --- a/dcron_test.go +++ b/dcron_test.go @@ -4,6 +4,7 @@ import ( "fmt" "log" "os" + "sync" "testing" "time" @@ -100,7 +101,7 @@ func Test_SecondsJob(t *testing.T) { dcr.Stop() } -func runSecondNode(id string, t *testing.T) { +func runSecondNode(id string, wg *sync.WaitGroup, runningTime time.Duration, t *testing.T) { redisCli := redis.NewClient(&redis.Options{ Addr: DefaultRedisAddr, }) @@ -128,13 +129,26 @@ func runSecondNode(id string, t *testing.T) { }) require.Nil(t, err) dcr.Start() + <-time.After(runningTime) + dcr.Stop() + wg.Done() } func Test_SecondJobWithPanicAndMultiNodes(t *testing.T) { - go runSecondNode("1", t) - go runSecondNode("2", t) - go runSecondNode("3", t) - go runSecondNode("4", t) - go runSecondNode("5", t) - time.Sleep(45 * time.Second) + wg := &sync.WaitGroup{} + wg.Add(5) + go runSecondNode("1", wg, 45*time.Second, t) + go runSecondNode("2", wg, 45*time.Second, t) + go runSecondNode("3", wg, 45*time.Second, t) + go runSecondNode("4", wg, 45*time.Second, t) + go runSecondNode("5", wg, 45*time.Second, t) + wg.Wait() +} + +func Test_SecondJobWithStopAndSwapNode(t *testing.T) { + wg := &sync.WaitGroup{} + wg.Add(2) + go runSecondNode("1", wg, 60*time.Second, t) + go runSecondNode("2", wg, 20*time.Second, t) + wg.Wait() } diff --git a/driver/v2/redisclusterdriver.go b/driver/v2/redisclusterdriver.go deleted file mode 100644 index 5ec3cc8..0000000 --- a/driver/v2/redisclusterdriver.go +++ /dev/null @@ -1 +0,0 @@ -package v2 diff --git a/node_pool.go b/node_pool.go index 8e07ac6..c611ce7 100644 --- a/node_pool.go +++ b/node_pool.go @@ -37,6 +37,7 @@ func newNodePool(serviceName string, driver driver.DriverV2, updateDuration time logger: &dlog.StdLogger{ Log: log.Default(), }, + stopChan: make(chan int, 1), } if logger != nil { np.logger = logger @@ -106,10 +107,12 @@ func (np *NodePool) updateHashRing(nodes []string) { np.rwMut.Lock() defer np.rwMut.Unlock() if np.equalRing(nodes) { + np.logger.Infof("nowNodes=%v, preNodes=%v", nodes, np.preNodes) return } np.logger.Infof("update hashRing nodes=%+v", nodes) - np.preNodes = nodes + np.preNodes = make([]string, len(nodes)) + copy(np.preNodes, nodes) np.nodes = consistenthash.New(np.hashReplicas, np.hashFn) for _, v := range nodes { np.nodes.Add(v) From 9a596640806b3dcc3615e624ae0d51992493f9d1 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Tue, 11 Apr 2023 22:34:21 +0800 Subject: [PATCH 07/27] add bash --- examples/example/README.md | 17 +++++++++++++++-- examples/example/kill-instance.sh | 6 ++++++ examples/example/run-instance.sh | 5 +++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100755 examples/example/kill-instance.sh create mode 100755 examples/example/run-instance.sh diff --git a/examples/example/README.md b/examples/example/README.md index 6346bfc..f4cf566 100644 --- a/examples/example/README.md +++ b/examples/example/README.md @@ -12,11 +12,24 @@ go build -o bin/example example.go ```bash # ./run.sh $number_of_process $number_of_cronjob # in linux -./run.sh 5 3 +./run.sh 5 10 +``` +## run 1 instance +```bash +# in linux +# ./run-instance.sh $sub_id_for_this_process $number_of_cronjob +./run-instance.sh 6 10 ``` -## stop +## stop all ```bash # in linux ./killexamples.sh +``` + +## stop 1 instance +```bash +# in linux +# ./kill-instance.sh $sub_id +./kill-instance.sh 2 ``` \ No newline at end of file diff --git a/examples/example/kill-instance.sh b/examples/example/kill-instance.sh new file mode 100755 index 0000000..8afd672 --- /dev/null +++ b/examples/example/kill-instance.sh @@ -0,0 +1,6 @@ +#!/bin/bash +kill_instance() { + ps -ef | grep example | grep "sub_id $1" | grep -v grep | awk '{print $2}' | xargs kill -9 +} + +kill_instance $1 \ No newline at end of file diff --git a/examples/example/run-instance.sh b/examples/example/run-instance.sh new file mode 100755 index 0000000..564a3d5 --- /dev/null +++ b/examples/example/run-instance.sh @@ -0,0 +1,5 @@ +start_example() { + nohup ./bin/example -sub_id $1 -jobnumber $2 & +} + +start_example $1 $2 \ No newline at end of file From ebac96c477c397a0d6d35bc0b2b05ae42917d9f8 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Tue, 11 Apr 2023 22:48:07 +0800 Subject: [PATCH 08/27] update readme --- README.md | 15 ++++++++------- README_CN.md | 15 ++++++++------- driver/driver.go | 6 ++++++ driver/v2/redisdriver.go | 3 +-- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index ff9f715..22b4e95 100644 --- a/README.md +++ b/README.md @@ -33,16 +33,17 @@ If use distributed-lock to implement it. I will depends on the system-time of ea 1. Create redisDriver instance, set the `ServiceName` and initialize `dcron`. The `ServiceName` will defined the same task unit. ```golang - drv, _ := redis.NewDriver(&redis.Options{ - Host: "127.0.0.1:6379" - }) - dcron := NewDcron("server1", drv) +redisCli := redis.NewClient(&redis.Options{ + Addr: DefaultRedisAddr, +}) +drv := driver.NewRedisDriver(redisCli) +dcron := NewDcron("server1", drv) ``` 2. Use cron-language to add task, you should set the `TaskName`, the `TaskName` is the primary-key of each task. ```golang - dcron.AddFunc("test1","*/3 * * * *",func(){ - fmt.Println("execute test1 task",time.Now().Format("15:04:05")) - }) +dcron.AddFunc("test1","*/3 * * * *",func(){ + fmt.Println("execute test1 task",time.Now().Format("15:04:05")) +}) ``` 3. Begin the task ```golang diff --git a/README_CN.md b/README_CN.md index c38f082..e99a671 100644 --- a/README_CN.md +++ b/README_CN.md @@ -32,16 +32,17 @@ a lightweight distributed job scheduler library based on redis or etcd 1.创建redisDriver实例,指定服务名并初始化dcron。服务名为执行相同任务的单元。 ```golang - drv, _ := redis.NewDriver(&redis.Options{ - Host: "127.0.0.1:6379" - }) - dcron := NewDcron("server1", drv) +redisCli := redis.NewClient(&redis.Options{ + Addr: DefaultRedisAddr, +}) +drv := driver.NewRedisDriver(redisCli) +dcron := NewDcron("server1", drv) ``` 2.使用cron语法添加任务,需要指定任务名。任务名作为任务的唯一标识,必须保证唯一。 ```golang - dcron.AddFunc("test1","*/3 * * * *",func(){ - fmt.Println("执行 test1 任务",time.Now().Format("15:04:05")) - }) +dcron.AddFunc("test1","*/3 * * * *",func(){ + fmt.Println("执行 test1 任务",time.Now().Format("15:04:05")) +}) ``` 3.开始任务。 ```golang diff --git a/driver/driver.go b/driver/driver.go index 902f0d6..87f0e25 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -3,7 +3,9 @@ package driver import ( "time" + "github.com/go-redis/redis/v8" "github.com/libi/dcron/dlog" + v2 "github.com/libi/dcron/driver/v2" ) //Driver is a driver interface @@ -27,3 +29,7 @@ type DriverV2 interface { Start() (err error) Stop() (err error) } + +func NewRedisDriver(redisClient *redis.Client) DriverV2 { + return v2.NewRedisDriver(redisClient) +} diff --git a/driver/v2/redisdriver.go b/driver/v2/redisdriver.go index 3b400b2..b6ee97a 100644 --- a/driver/v2/redisdriver.go +++ b/driver/v2/redisdriver.go @@ -10,7 +10,6 @@ import ( "github.com/go-redis/redis/v8" "github.com/libi/dcron/dlog" - "github.com/libi/dcron/driver" ) type RedisDriver struct { @@ -25,7 +24,7 @@ type RedisDriver struct { sync.Mutex } -func NewRedisDriver(redisClient *redis.Client) driver.DriverV2 { +func NewRedisDriver(redisClient *redis.Client) *RedisDriver { rd := &RedisDriver{ c: redisClient, logger: &dlog.StdLogger{ From 748cb1dc2b8d52b6fc4ebbb7d9165db309a7f319 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Wed, 12 Apr 2023 21:39:20 +0800 Subject: [PATCH 09/27] remove old driver --- driver/driver.go | 11 -- driver/driver_test.go | 54 ------- driver/etcd/etcd_driver.go | 3 - driver/redis/redis_driver.go | 107 -------------- driver/redis/redis_driver_test.go | 26 ---- driver/redis_cluster/redis_cluster.go | 156 --------------------- driver/redis_cluster/redis_cluster_test.go | 22 --- 7 files changed, 379 deletions(-) delete mode 100644 driver/driver_test.go delete mode 100644 driver/redis/redis_driver.go delete mode 100644 driver/redis/redis_driver_test.go delete mode 100644 driver/redis_cluster/redis_cluster.go delete mode 100644 driver/redis_cluster/redis_cluster_test.go diff --git a/driver/driver.go b/driver/driver.go index 87f0e25..7d54a73 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -8,17 +8,6 @@ import ( v2 "github.com/libi/dcron/driver/v2" ) -//Driver is a driver interface -type Driver interface { - // Ping is check dirver is valid - Ping() error - SetLogger(log dlog.Logger) - SetHeartBeat(nodeID string) - SetTimeout(timeout time.Duration) - GetServiceNodeList(ServiceName string) ([]string, error) - RegisterServiceNode(ServiceName string) (string, error) -} - type DriverV2 interface { // init driver Init(serviceName string, timeout time.Duration, logger dlog.Logger) diff --git a/driver/driver_test.go b/driver/driver_test.go deleted file mode 100644 index 380c085..0000000 --- a/driver/driver_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package driver_test - -import ( - "flag" - "testing" - "time" - - "github.com/go-redis/redis/v8" - DcronDriver "github.com/libi/dcron/driver" - RedisDriver "github.com/libi/dcron/driver/redis" - "github.com/stretchr/testify/require" -) - -var ( - redisAddr = flag.String("rAddr", "127.0.0.1:6379", "redis serve addr") - password = flag.String("password", "", "redis password") -) - -// you should run this test when the redis is served. -// you can run test like below command. -// go test -v --rAddr 127.0.0.1:6379 -password 123456 -// rAddr is the redis serve addr - -func TestRedisDriver(t *testing.T) { - t.Logf("test redis serve on %s", *redisAddr) - - serviceName := t.Name() - NewDriverFunc := func(_ int) (DcronDriver.Driver, error) { - driver, err := RedisDriver.NewDriver(&redis.Options{ - Addr: *redisAddr, - Password: *password, - }) - require.Nil(t, err) - require.Nil(t, driver.Ping()) - driver.SetTimeout(5 * time.Second) - nodeId, err := driver.RegisterServiceNode(serviceName) - require.Nil(t, err) - driver.SetHeartBeat(nodeId) - return driver, nil - } - n := 10 - drivers := make([]DcronDriver.Driver, 0) - for i := 0; i < n; i++ { - dr, err := NewDriverFunc(i) - require.Nilf(t, err, "new driver error %d", i) - drivers = append(drivers, dr) - } - - for i := 0; i < n; i++ { - nodeIds, err := drivers[i].GetServiceNodeList(serviceName) - require.Nilf(t, err, "get service nodelist error %d", i) - require.Equal(t, n, len(nodeIds)) - } -} diff --git a/driver/etcd/etcd_driver.go b/driver/etcd/etcd_driver.go index 4b3fb03..f9d6bc1 100644 --- a/driver/etcd/etcd_driver.go +++ b/driver/etcd/etcd_driver.go @@ -8,13 +8,10 @@ import ( "github.com/google/uuid" "github.com/libi/dcron/dlog" - "github.com/libi/dcron/driver" "go.etcd.io/etcd/api/v3/mvccpb" clientv3 "go.etcd.io/etcd/client/v3" ) -var _ driver.Driver = &EtcdDriver{} - const ( defaultLease = 5 // 5 second ttl dialTimeout = 3 * time.Second diff --git a/driver/redis/redis_driver.go b/driver/redis/redis_driver.go deleted file mode 100644 index 2c88a9b..0000000 --- a/driver/redis/redis_driver.go +++ /dev/null @@ -1,107 +0,0 @@ -package redis - -import ( - "context" - "fmt" - "log" - "time" - - "github.com/go-redis/redis/v8" - "github.com/libi/dcron/dlog" - "github.com/libi/dcron/driver" -) - -// RedisDriver is redisDriver -type RedisDriver struct { - client *redis.Client - timeout time.Duration - Key string - logger dlog.Logger -} - -// NewDriver return a redis driver -func NewDriver(opts *redis.Options) (*RedisDriver, error) { - return &RedisDriver{ - client: redis.NewClient(opts), - logger: &dlog.StdLogger{ - Log: log.Default(), - }, - }, nil -} - -// Ping is check redis valid -func (rd *RedisDriver) Ping() error { - reply, err := rd.client.Ping(context.Background()).Result() - if err != nil { - return err - } - if reply != "PONG" { - return fmt.Errorf("Ping received is error, %s", string(reply)) - } - return err -} - -//SetTimeout set redis timeout -func (rd *RedisDriver) SetTimeout(timeout time.Duration) { - rd.timeout = timeout -} - -//SetHeartBeat set heatbeat -func (rd *RedisDriver) SetHeartBeat(nodeID string) { - go rd.heartBeat(nodeID) -} -func (rd *RedisDriver) heartBeat(nodeID string) { - - //每间隔timeout/2设置一次key的超时时间为timeout - key := nodeID - tickers := time.NewTicker(rd.timeout / 2) - for range tickers.C { - keyExist, err := rd.client.Expire(context.Background(), key, rd.timeout).Result() - if err != nil { - rd.logger.Errorf("redis expire error %+v", err) - continue - } - if !keyExist { - if err := rd.registerServiceNode(nodeID); err != nil { - rd.logger.Errorf("register service node error %+v", err) - } - } - } -} - -func (rd *RedisDriver) SetLogger(log dlog.Logger) { - rd.logger = log -} - -//GetServiceNodeList get a serveice node list -func (rd *RedisDriver) GetServiceNodeList(serviceName string) ([]string, error) { - mathStr := fmt.Sprintf("%s*", driver.GetKeyPre(serviceName)) - return rd.scan(mathStr) -} - -//RegisterServiceNode register a service node -func (rd *RedisDriver) RegisterServiceNode(serviceName string) (nodeID string, err error) { - nodeID = driver.GetNodeId(serviceName) - if err := rd.registerServiceNode(nodeID); err != nil { - return "", err - } - return nodeID, nil -} - -func (rd *RedisDriver) registerServiceNode(nodeID string) error { - return rd.client.SetEX(context.Background(), nodeID, nodeID, rd.timeout).Err() -} - -func (rd *RedisDriver) scan(matchStr string) ([]string, error) { - ret := make([]string, 0) - ctx := context.Background() - iter := rd.client.Scan(ctx, 0, matchStr, -1).Iterator() - for iter.Next(ctx) { - err := iter.Err() - if err != nil { - return nil, err - } - ret = append(ret, iter.Val()) - } - return ret, nil -} diff --git a/driver/redis/redis_driver_test.go b/driver/redis/redis_driver_test.go deleted file mode 100644 index 757d675..0000000 --- a/driver/redis/redis_driver_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package redis - -import ( - "testing" - - "github.com/go-redis/redis/v8" -) - -func TestRedisDriver_Scan(t *testing.T) { - rd, err := NewDriver(&redis.Options{ - Addr: "127.0.0.1:6379", - }) - if err != nil { - return - } - testStr := []string{ - "*", "-----", "", "!@#$%^", "1", "false", - } - for _, str := range testStr { - ret, err := rd.scan(str) - if err != nil { - t.Error(err) - } - t.Log(ret) - } -} diff --git a/driver/redis_cluster/redis_cluster.go b/driver/redis_cluster/redis_cluster.go deleted file mode 100644 index 00bbcaf..0000000 --- a/driver/redis_cluster/redis_cluster.go +++ /dev/null @@ -1,156 +0,0 @@ -package redis_cluster - -import ( - "context" - "crypto/tls" - "fmt" - "log" - "sync" - "time" - - "github.com/go-redis/redis/v8" - "github.com/libi/dcron/dlog" - "github.com/libi/dcron/driver" -) - -// Conf is redis cluster client config -type Conf struct { - Proto string - - // first use addr - Addrs []string - Password string - - MaxRedirects int - ReadOnly bool - - TLSConfig *tls.Config -} - -// RedisClusterDriver is -type RedisClusterDriver struct { - conf *Conf - redisClient *redis.ClusterClient - timeout time.Duration - Key string - ctx context.Context - logger dlog.Logger -} - -// NewDriver return a redis driver -func NewDriver(conf *Conf) (*RedisClusterDriver, error) { - opts := &redis.ClusterOptions{ - Addrs: conf.Addrs, - Password: conf.Password, - ReadOnly: conf.ReadOnly, - } - if conf.MaxRedirects > 0 { - opts.MaxRedirects = conf.MaxRedirects - } - if conf.TLSConfig != nil { - opts.TLSConfig = conf.TLSConfig - } - redisClient := redis.NewClusterClient(opts) - return &RedisClusterDriver{ - conf: conf, - redisClient: redisClient, - ctx: context.TODO(), - logger: &dlog.StdLogger{ - Log: log.Default(), - }, - }, nil -} - -// Ping to check redis cluster is valid or not -func (rd *RedisClusterDriver) Ping() error { - if err := rd.redisClient.Ping(rd.ctx).Err(); err != nil { - return err - } - return nil -} - -//SetTimeout set redis key expiration timeout -func (rd *RedisClusterDriver) SetTimeout(timeout time.Duration) { - rd.timeout = timeout -} - -//SetHeartBeat set heartbeat -func (rd *RedisClusterDriver) SetHeartBeat(nodeID string) { - go rd.heartBeat(nodeID) -} -func (rd *RedisClusterDriver) heartBeat(nodeID string) { - //每间隔timeout/2设置一次key的超时时间为timeout - key := nodeID - tickers := time.NewTicker(rd.timeout / 2) - for range tickers.C { - if err := rd.redisClient.Expire(rd.ctx, key, rd.timeout).Err(); err != nil { - rd.logger.Errorf("redis expire error %+v", err) - continue - } - } -} - -//GetServiceNodeList get a service node list on redis cluster -func (rd *RedisClusterDriver) GetServiceNodeList(serviceName string) ([]string, error) { - mathStr := fmt.Sprintf("%s*", driver.GetKeyPre(serviceName)) - return rd.scan(mathStr) -} - -//RegisterServiceNode register a service node -func (rd *RedisClusterDriver) RegisterServiceNode(serviceName string) (nodeID string, err error) { - nodeID = driver.GetNodeId(serviceName) - key := driver.GetKeyPre(serviceName) + nodeID - if err := rd.redisClient.Set(rd.ctx, key, nodeID, rd.timeout).Err(); err != nil { - return "", err - } - return key, nil -} - -func (rd *RedisClusterDriver) SetLogger(log dlog.Logger) { - rd.logger = log -} - -/** -集群模式下,scan命令只能在单机上执行,因此需要遍历master节点进行合并 -*/ -func (rd *RedisClusterDriver) scan(matchStr string) ([]string, error) { - l := newSyncList() - // scan不能直接执行,只能在每个master节点上上逐个执行再合并 - if err := rd.redisClient.ForEachMaster(rd.ctx, func(ctx context.Context, master *redis.Client) error { - iter := master.Scan(ctx, 0, matchStr, -1).Iterator() - for iter.Next(rd.ctx) { - err := iter.Err() - if err != nil { - return err - } - l.Append(iter.Val()) - } - return nil - }); err != nil { - return l.Values(), err - } - return l.Values(), nil -} - -type syncList struct { - sync.RWMutex - arr []string -} - -func newSyncList() *syncList { - l := new(syncList) - l.arr = make([]string, 0) - return l -} - -func (l *syncList) Append(val string) { - l.Lock() - defer l.Unlock() - l.arr = append(l.arr, val) -} - -func (l *syncList) Values() []string { - l.RLock() - defer l.RUnlock() - return l.arr -} diff --git a/driver/redis_cluster/redis_cluster_test.go b/driver/redis_cluster/redis_cluster_test.go deleted file mode 100644 index ca2a94b..0000000 --- a/driver/redis_cluster/redis_cluster_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package redis_cluster - -import ( - "testing" - - "github.com/libi/dcron/driver" -) - -func TestClusterScan(t *testing.T) { - rd, err := NewDriver(&Conf{ - Addrs: []string{"127.0.0.1:6379"}, - }) - if err != nil { - return - } - matchStr := driver.GetKeyPre("service") - ret, err := rd.scan(matchStr) - if err != nil { - t.Log(err) - } - t.Log(ret) -} From e24e44f47891f8a5c9872dd4dd252a90ae06b839 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Wed, 12 Apr 2023 21:44:26 +0800 Subject: [PATCH 10/27] remove useless function --- README_CN.md | 2 ++ driver/util.go | 22 ---------------------- 2 files changed, 2 insertions(+), 22 deletions(-) delete mode 100644 driver/util.go diff --git a/README_CN.md b/README_CN.md index e99a671..15f9544 100644 --- a/README_CN.md +++ b/README_CN.md @@ -38,6 +38,8 @@ redisCli := redis.NewClient(&redis.Options{ drv := driver.NewRedisDriver(redisCli) dcron := NewDcron("server1", drv) ``` +当然,如果你可以自己实现一个自定义的Driver也是可以的,只需要实现[DriverV2](driver/driver.go)接口即可。 + 2.使用cron语法添加任务,需要指定任务名。任务名作为任务的唯一标识,必须保证唯一。 ```golang dcron.AddFunc("test1","*/3 * * * *",func(){ diff --git a/driver/util.go b/driver/util.go deleted file mode 100644 index f3dfc10..0000000 --- a/driver/util.go +++ /dev/null @@ -1,22 +0,0 @@ -package driver - -import "github.com/google/uuid" - -// GlobalKeyPrefix is global redis key preifx -const GlobalKeyPrefix = "distributed-cron:" - -func GetKeyPre(serviceName string) string { - return GlobalKeyPrefix + serviceName + ":" -} - -func GetNodeId(serviceName string) string { - return GetKeyPre(serviceName) + uuid.New().String() -} - -func GetStableJobStore(serviceName string) string { - return GetKeyPre(serviceName) + "stable-jobs" -} - -func GetStableJobStoreTxKey(serviceName string) string { - return GetKeyPre(serviceName) + "TX:stable-jobs" -} From d424c72b1b935834b1e3bbbb6259577f3f42f99b Mon Sep 17 00:00:00 2001 From: dxyinme Date: Sat, 15 Apr 2023 09:03:09 +0800 Subject: [PATCH 11/27] update redisdrier test --- dcron_test.go | 8 +++---- driver/v2/redisdriver_test.go | 37 +++++++++++++++++++++++++++++++++ examples/example/example.go | 4 ++-- examples/stablejob/stablejob.go | 4 ++-- go.mod | 1 + go.sum | 7 +++++++ 6 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 driver/v2/redisdriver_test.go diff --git a/dcron_test.go b/dcron_test.go index 30a9d5e..cba3e14 100644 --- a/dcron_test.go +++ b/dcron_test.go @@ -11,7 +11,7 @@ import ( "github.com/go-redis/redis/v8" "github.com/libi/dcron" "github.com/libi/dcron/dlog" - v2 "github.com/libi/dcron/driver/v2" + "github.com/libi/dcron/driver" "github.com/robfig/cron/v3" "github.com/stretchr/testify/require" ) @@ -44,7 +44,7 @@ func runNode(t *testing.T) { redisCli := redis.NewClient(&redis.Options{ Addr: DefaultRedisAddr, }) - drv := v2.NewRedisDriver(redisCli) + drv := driver.NewRedisDriver(redisCli) dcron := dcron.NewDcron("server1", drv) //添加多个任务 启动多个节点时 任务会均匀分配给各个节点 @@ -88,7 +88,7 @@ func Test_SecondsJob(t *testing.T) { redisCli := redis.NewClient(&redis.Options{ Addr: DefaultRedisAddr, }) - drv := v2.NewRedisDriver(redisCli) + drv := driver.NewRedisDriver(redisCli) dcr := dcron.NewDcronWithOption(t.Name(), drv, dcron.CronOptionSeconds()) err := dcr.AddFunc("job1", "*/5 * * * * *", func() { t.Log(time.Now()) @@ -105,7 +105,7 @@ func runSecondNode(id string, wg *sync.WaitGroup, runningTime time.Duration, t * redisCli := redis.NewClient(&redis.Options{ Addr: DefaultRedisAddr, }) - drv := v2.NewRedisDriver(redisCli) + drv := driver.NewRedisDriver(redisCli) dcr := dcron.NewDcronWithOption(t.Name(), drv, dcron.CronOptionSeconds(), dcron.WithLogger(&dlog.StdLogger{ diff --git a/driver/v2/redisdriver_test.go b/driver/v2/redisdriver_test.go new file mode 100644 index 0000000..b37fc3e --- /dev/null +++ b/driver/v2/redisdriver_test.go @@ -0,0 +1,37 @@ +package v2_test + +import ( + "testing" + "time" + + "github.com/alicebob/miniredis/v2" + "github.com/go-redis/redis/v8" + "github.com/libi/dcron/driver" + "github.com/stretchr/testify/require" +) + +func TestRedisDriver_GetNodes(t *testing.T) { + rds := miniredis.RunT(t) + drvs := make([]driver.DriverV2, 0) + N := 10 + for i := 0; i < N; i++ { + redisCli := redis.NewClient(&redis.Options{ + Addr: rds.Addr(), + }) + drv := driver.NewRedisDriver(redisCli) + drv.Init(t.Name(), 5*time.Second, nil) + err := drv.Start() + require.Nil(t, err) + drvs = append(drvs, drv) + } + + for _, v := range drvs { + nodes, err := v.GetNodes() + require.Nil(t, err) + require.Equal(t, N, len(nodes)) + } + + for _, v := range drvs { + v.Stop() + } +} diff --git a/examples/example/example.go b/examples/example/example.go index 726e54c..f7a8af3 100644 --- a/examples/example/example.go +++ b/examples/example/example.go @@ -12,7 +12,7 @@ import ( "github.com/google/uuid" "github.com/libi/dcron" "github.com/libi/dcron/dlog" - v2 "github.com/libi/dcron/driver/v2" + "github.com/libi/dcron/driver" ) const ( @@ -62,7 +62,7 @@ func main() { redisCli := redis.NewClient(&redis.Options{ Addr: *addr, }) - driver := v2.NewRedisDriver(redisCli) + driver := driver.NewRedisDriver(redisCli) logger := &dlog.StdLogger{ Log: log.New(os.Stdout, "["+*subId+"]", log.LstdFlags), } diff --git a/examples/stablejob/stablejob.go b/examples/stablejob/stablejob.go index 4484bfd..d13f916 100644 --- a/examples/stablejob/stablejob.go +++ b/examples/stablejob/stablejob.go @@ -9,7 +9,7 @@ import ( "github.com/go-redis/redis/v8" "github.com/libi/dcron" "github.com/libi/dcron/dlog" - v2 "github.com/libi/dcron/driver/v2" + "github.com/libi/dcron/driver" examplesCommon "github.com/libi/dcron/examples/common" ) @@ -46,7 +46,7 @@ func main() { } redisCli := redis.NewClient(redisOpts) - drv := v2.NewRedisDriver(redisCli) + drv := driver.NewRedisDriver(redisCli) dcronInstance := dcron.NewDcronWithOption(IEnv.ServerName, drv, dcron.WithLogger(&dlog.StdLogger{ Log: logger, diff --git a/go.mod b/go.mod index ddc0fa0..e878a78 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/libi/dcron go 1.16 require ( + github.com/alicebob/miniredis/v2 v2.30.1 github.com/go-redis/redis/v8 v8.11.5 github.com/google/uuid v1.1.2 github.com/robfig/cron/v3 v3.0.1 diff --git a/go.sum b/go.sum index 27b808b..559aad9 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,10 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk= +github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= +github.com/alicebob/miniredis/v2 v2.30.1 h1:HM1rlQjq1bm9yQcsawJqSZBJ9AYgxvjkMsNtddh90+g= +github.com/alicebob/miniredis/v2 v2.30.1/go.mod h1:b25qWj4fCEsBeAAR2mlb0ufImGC6uH3VlUfb/HS5zKg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -330,6 +334,8 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE= +github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= @@ -466,6 +472,7 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From 8816451ae04f836dcf1fb6df6f0fca7ccc3d7ef1 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Sun, 16 Apr 2023 14:50:17 +0800 Subject: [PATCH 12/27] add etcd client --- driver/driver.go | 6 + driver/etcd/etcd_driver.go | 227 ----------------------- driver/etcd/etcd_driver_test.go | 92 ---------- driver/v2/etcddriver.go | 200 +++++++++++++++++++++ driver/v2/etcddriver_test.go | 1 + driver/v2/redisdriver.go | 16 +- driver/v2/redisdriver_test.go | 54 +++++- driver/v2/util.go | 1 - go.mod | 3 +- go.sum | 306 -------------------------------- 10 files changed, 270 insertions(+), 636 deletions(-) delete mode 100644 driver/etcd/etcd_driver.go delete mode 100644 driver/etcd/etcd_driver_test.go create mode 100644 driver/v2/etcddriver_test.go diff --git a/driver/driver.go b/driver/driver.go index 7d54a73..7260414 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -6,8 +6,10 @@ import ( "github.com/go-redis/redis/v8" "github.com/libi/dcron/dlog" v2 "github.com/libi/dcron/driver/v2" + clientv3 "go.etcd.io/etcd/client/v3" ) +// there is only one driver for one dcron. type DriverV2 interface { // init driver Init(serviceName string, timeout time.Duration, logger dlog.Logger) @@ -22,3 +24,7 @@ type DriverV2 interface { func NewRedisDriver(redisClient *redis.Client) DriverV2 { return v2.NewRedisDriver(redisClient) } + +func NewEtcdDriver(etcdCli *clientv3.Client) DriverV2 { + return v2.NewEtcdDriver(etcdCli) +} diff --git a/driver/etcd/etcd_driver.go b/driver/etcd/etcd_driver.go deleted file mode 100644 index f9d6bc1..0000000 --- a/driver/etcd/etcd_driver.go +++ /dev/null @@ -1,227 +0,0 @@ -package etcd - -import ( - "context" - "log" - "sync" - "time" - - "github.com/google/uuid" - "github.com/libi/dcron/dlog" - "go.etcd.io/etcd/api/v3/mvccpb" - clientv3 "go.etcd.io/etcd/client/v3" -) - -const ( - defaultLease = 5 // 5 second ttl - dialTimeout = 3 * time.Second - businessTimeout = 5 * time.Second -) - -type EtcdDriver struct { - cli *clientv3.Client - lease int64 - serverList map[string]map[string]string - lock sync.RWMutex - leaseID clientv3.LeaseID - logger dlog.Logger -} - -//NewEtcdDriver ... -func NewEtcdDriver(config *clientv3.Config) (*EtcdDriver, error) { - cli, err := clientv3.New(*config) - if err != nil { - return nil, err - } - - ser := &EtcdDriver{ - cli: cli, - serverList: make(map[string]map[string]string, 10), - logger: &dlog.StdLogger{ - Log: log.Default(), - }, - } - - return ser, nil -} - -//设置key value,绑定租约 -func (s *EtcdDriver) putKeyWithLease(key, val string) (clientv3.LeaseID, error) { - //设置租约时间,最少5s - if s.lease < defaultLease { - s.lease = defaultLease - } - - ctx, cancel := context.WithTimeout(context.Background(), businessTimeout) - defer cancel() - - resp, err := s.cli.Grant(ctx, s.lease) - if err != nil { - return 0, err - } - //注册服务并绑定租约 - _, err = s.cli.Put(ctx, key, val, clientv3.WithLease(resp.ID)) - if err != nil { - return 0, err - } - - return resp.ID, nil -} - -func (s *EtcdDriver) randNodeID(serviceName string) (nodeID string) { - return getPrefix(serviceName) + uuid.New().String() -} - -//WatchService 初始化服务列表和监视 -func (s *EtcdDriver) watchService(serviceName string) error { - prefix := getPrefix(serviceName) - // 根据前缀获取现有的key - resp, err := s.cli.Get(context.Background(), prefix, clientv3.WithPrefix()) - if err != nil { - return err - } - - for _, ev := range resp.Kvs { - s.setServiceList(serviceName, string(ev.Key), string(ev.Value)) - } - - // 监视前缀,修改变更的server - go s.watcher(serviceName) - return nil -} - -func getPrefix(serviceName string) string { - return serviceName + "/" -} - -// watcher 监听前缀 -func (s *EtcdDriver) watcher(serviceName string) { - prefix := getPrefix(serviceName) - rch := s.cli.Watch(context.Background(), prefix, clientv3.WithPrefix()) - for wresp := range rch { - for _, ev := range wresp.Events { - switch ev.Type { - case mvccpb.PUT: //修改或者新增 - s.setServiceList(serviceName, string(ev.Kv.Key), string(ev.Kv.Value)) - case mvccpb.DELETE: //删除 - s.delServiceList(serviceName, string(ev.Kv.Key)) - } - } - } -} - -// setServiceList 新增服务地址 -func (s *EtcdDriver) setServiceList(serviceName, key, val string) { - s.lock.Lock() - defer s.lock.Unlock() - if _, ok := s.serverList[serviceName]; !ok { - nodeMap := map[string]string{ - key: val, - } - s.serverList[serviceName] = nodeMap - } else { - s.serverList[serviceName][key] = val - } -} - -// DelServiceList 删除服务地址 -func (s *EtcdDriver) delServiceList(serviceName, key string) { - s.lock.Lock() - defer s.lock.Unlock() - if nodeMap, ok := s.serverList[serviceName]; ok { - delete(nodeMap, key) - } -} - -// GetServices 获取服务地址 -func (s *EtcdDriver) getServices(serviceName string) []string { - s.lock.RLock() - defer s.lock.RUnlock() - addrs := make([]string, 0) - if nodeMap, ok := s.serverList[serviceName]; ok { - for _, v := range nodeMap { - addrs = append(addrs, v) - } - } - return addrs -} - -func (e *EtcdDriver) Ping() error { - return nil -} - -func (e *EtcdDriver) keepAlive(ctx context.Context, nodeID string) (<-chan *clientv3.LeaseKeepAliveResponse, error) { - var err error - e.leaseID, err = e.putKeyWithLease(nodeID, nodeID) - if err != nil { - e.logger.Errorf("putKeyWithLease error: %v", err) - return nil, err - } - - return e.cli.KeepAlive(ctx, e.leaseID) -} - -func (e *EtcdDriver) revoke() { - _, err := e.cli.Lease.Revoke(context.Background(), e.leaseID) - if err != nil { - log.Printf("lease revoke error: %v", err) - } -} - -func (e *EtcdDriver) SetHeartBeat(nodeID string) { - leaseCh, err := e.keepAlive(context.Background(), nodeID) - if err != nil { - e.logger.Errorf("setHeartBeat error: %v", err) - return - } - go func() { - defer func() { - err := recover() - if err != nil { - e.logger.Errorf("keepAlive panic: %v", err) - return - } - }() - for { - select { - case _, ok := <-leaseCh: - if !ok { - e.revoke() - e.SetHeartBeat(nodeID) - return - } - case <-time.After(businessTimeout): - e.logger.Errorf("ectd cli keepalive timeout") - return - } - } - }() -} - -func (e *EtcdDriver) SetLogger(log dlog.Logger) { - e.logger = log -} - -// SetTimeout set etcd lease timeout -func (e *EtcdDriver) SetTimeout(timeout time.Duration) { - e.lease = int64(timeout.Seconds()) -} - -// GetServiceNodeList get service notes -func (e *EtcdDriver) GetServiceNodeList(serviceName string) ([]string, error) { - return e.getServices(serviceName), nil -} - -// RegisterServiceNode register a node to service -func (e *EtcdDriver) RegisterServiceNode(serviceName string) (string, error) { - nodeId := e.randNodeID(serviceName) - _, err := e.putKeyWithLease(nodeId, nodeId) - if err != nil { - return "", err - } - err = e.watchService(serviceName) - if err != nil { - return "", err - } - return nodeId, nil -} diff --git a/driver/etcd/etcd_driver_test.go b/driver/etcd/etcd_driver_test.go deleted file mode 100644 index d7c6083..0000000 --- a/driver/etcd/etcd_driver_test.go +++ /dev/null @@ -1,92 +0,0 @@ -package etcd - -import ( - "testing" - "time" - - "github.com/stretchr/testify/require" - clientv3 "go.etcd.io/etcd/client/v3" - "go.etcd.io/etcd/tests/v3/integration" -) - -func TestEtcdDriver(t *testing.T) { - var lazyCluster = integration.NewLazyCluster() - defer lazyCluster.Terminate() - - ed, err := NewEtcdDriver(&clientv3.Config{ - Endpoints: lazyCluster.EndpointsV3(), - DialTimeout: dialTimeout, - }) - - require.Nil(t, err) - serviceName := "testService" - - nodeMap := make(map[string]string) - - count := 10 - - for i := 0; i < count; i++ { - nodeID, err := ed.RegisterServiceNode(serviceName) - require.Nil(t, err) - t.Logf("nodeId %v:%v", i, nodeID) - nodeMap[nodeID] = nodeID - } - - list, err := ed.GetServiceNodeList(serviceName) - - require.Nil(t, err) - - require.Equal(t, count, len(list)) - - for _, v := range list { - if _, ok := nodeMap[v]; !ok { - t.Errorf("nodeId %v not found!!!", v) - } - } - -} - -func TestSetHeartBeat(t *testing.T) { - - var lazyCluster = integration.NewLazyCluster() - defer lazyCluster.Terminate() - - ed, err := NewEtcdDriver(&clientv3.Config{ - Endpoints: lazyCluster.EndpointsV3(), - DialTimeout: dialTimeout, - }) - - require.Nil(t, err) - serviceName := "testService" - - nodeMap := make(map[string]string) - - count := 10 - - //一半设置心跳 - for i := 0; i < count; i++ { - nodeID, err := ed.RegisterServiceNode(serviceName) - require.Nil(t, err) - t.Logf("nodeId %v:%v", i, nodeID) - if i%2 == 0 { - ed.SetHeartBeat(nodeID) - nodeMap[nodeID] = nodeID - } - } - - time.Sleep(time.Second * 10) - - //10s后获取serverList,预期只能取到一半 - list, err := ed.GetServiceNodeList(serviceName) - - require.Nil(t, err) - - require.Equal(t, len(nodeMap), len(list)) - - for _, v := range list { - if _, ok := nodeMap[v]; !ok { - t.Errorf("nodeId %v not found!!!", v) - } - } - -} diff --git a/driver/v2/etcddriver.go b/driver/v2/etcddriver.go index 5ec3cc8..ea571eb 100644 --- a/driver/v2/etcddriver.go +++ b/driver/v2/etcddriver.go @@ -1 +1,201 @@ package v2 + +import ( + "context" + "log" + "sync" + "time" + + "github.com/libi/dcron/dlog" + "go.etcd.io/etcd/api/v3/mvccpb" + clientv3 "go.etcd.io/etcd/client/v3" +) + +const ( + defaultLease = 5 // min lease time + dialTimeout = 3 * time.Second + businessTimeout = 5 * time.Second +) + +type EtcdDriver struct { + nodeID string + serviceName string + + cli *clientv3.Client + lease int64 + nodes *sync.Map + leaseID clientv3.LeaseID + logger dlog.Logger + + stopChan chan int +} + +//NewEtcdDriver +func NewEtcdDriver(cli *clientv3.Client) *EtcdDriver { + ser := &EtcdDriver{ + cli: cli, + nodes: &sync.Map{}, + logger: &dlog.StdLogger{ + Log: log.Default(), + }, + } + + return ser +} + +//设置key value,绑定租约 +func (e *EtcdDriver) putKeyWithLease(key, val string) (clientv3.LeaseID, error) { + //设置租约时间,最少5s + if e.lease < defaultLease { + e.lease = defaultLease + } + + ctx, cancel := context.WithTimeout(context.Background(), businessTimeout) + defer cancel() + resp, err := e.cli.Grant(ctx, e.lease) + if err != nil { + return 0, err + } + //注册服务并绑定租约 + _, err = e.cli.Put(ctx, key, val, clientv3.WithLease(resp.ID)) + if err != nil { + return 0, err + } + + return resp.ID, nil +} + +//WatchService 初始化服务列表和监视 +func (e *EtcdDriver) watchService(serviceName string) error { + prefix := GetKeyPre(serviceName) + // 根据前缀获取现有的key + resp, err := e.cli.Get(context.Background(), prefix, clientv3.WithPrefix()) + if err != nil { + return err + } + + for _, ev := range resp.Kvs { + e.setServiceList(string(ev.Key), string(ev.Value)) + } + + // 监视前缀,修改变更的server + go e.watcher(serviceName) + return nil +} + +// watcher 监听前缀 +func (e *EtcdDriver) watcher(serviceName string) { + prefix := GetKeyPre(serviceName) + rch := e.cli.Watch(context.Background(), prefix, clientv3.WithPrefix()) + for wresp := range rch { + for _, ev := range wresp.Events { + switch ev.Type { + case mvccpb.PUT: //修改或者新增 + e.setServiceList(string(ev.Kv.Key), string(ev.Kv.Value)) + case mvccpb.DELETE: //删除 + e.delServiceList(string(ev.Kv.Key)) + } + } + } +} + +// setServiceList 新增服务地址 +func (e *EtcdDriver) setServiceList(key, val string) { + e.nodes.Store(key, val) +} + +// DelServiceList 删除服务地址 +func (e *EtcdDriver) delServiceList(key string) { + e.nodes.Delete(key) +} + +// GetServices 获取服务地址 +func (e *EtcdDriver) getServices() []string { + addrs := make([]string, 0) + e.nodes.Range(func(key, _ interface{}) bool { + addrs = append(addrs, key.(string)) + return true + }) + return addrs +} + +func (e *EtcdDriver) keepAlive(ctx context.Context, nodeID string) (<-chan *clientv3.LeaseKeepAliveResponse, error) { + var err error + e.leaseID, err = e.putKeyWithLease(nodeID, nodeID) + if err != nil { + e.logger.Errorf("putKeyWithLease error: %v", err) + return nil, err + } + + return e.cli.KeepAlive(ctx, e.leaseID) +} + +func (e *EtcdDriver) revoke() { + _, err := e.cli.Lease.Revoke(context.Background(), e.leaseID) + if err != nil { + e.logger.Printf("lease revoke error: %v", err) + } +} + +func (e *EtcdDriver) heartBeat() { +label: + leaseCh, err := e.keepAlive(context.Background(), e.nodeID) + if err != nil { + return + } + for { + select { + case <-e.stopChan: + { + e.revoke() + e.logger.Errorf("driver stopped") + return + } + case _, ok := <-leaseCh: + { + // if lease timeout, goto top of + // this function to keepalive + if !ok { + goto label + } + } + case <-time.After(businessTimeout): + { + e.logger.Errorf("ectd cli keepalive timeout") + return + } + } + } +} + +func (e *EtcdDriver) Init(serverName string, timeout time.Duration, logger dlog.Logger) { + e.serviceName = serverName + e.nodeID = GetNodeId(serverName) + e.lease = int64(timeout.Seconds()) + if logger != nil { + e.logger = logger + } +} + +func (e *EtcdDriver) NodeID() string { + return e.nodeID +} + +func (e *EtcdDriver) GetNodes() (nodes []string, err error) { + return e.getServices(), nil +} + +func (e *EtcdDriver) Start() (err error) { + e.stopChan = make(chan int, 1) + go e.heartBeat() + err = e.watchService(e.serviceName) + if err != nil { + return + } + return nil +} + +func (e *EtcdDriver) Stop() (err error) { + close(e.stopChan) + return +} diff --git a/driver/v2/etcddriver_test.go b/driver/v2/etcddriver_test.go new file mode 100644 index 0000000..b0591ff --- /dev/null +++ b/driver/v2/etcddriver_test.go @@ -0,0 +1 @@ +package v2_test diff --git a/driver/v2/redisdriver.go b/driver/v2/redisdriver.go index b6ee97a..fc19d18 100644 --- a/driver/v2/redisdriver.go +++ b/driver/v2/redisdriver.go @@ -60,6 +60,7 @@ func (rd *RedisDriver) Start() (err error) { // register err = rd.registerServiceNode() if err != nil { + rd.logger.Errorf("register service error=%v", err) return } // heartbeat timer @@ -71,6 +72,7 @@ func (rd *RedisDriver) Stop() (err error) { rd.Lock() defer rd.Unlock() close(rd.stopChan) + rd.started = false return } @@ -86,14 +88,18 @@ func (rd *RedisDriver) heartBeat() { for { select { case <-tick.C: - if err := rd.registerServiceNode(); err != nil { - rd.logger.Errorf("register service node error %+v", err) + { + if err := rd.registerServiceNode(); err != nil { + rd.logger.Errorf("register service node error %+v", err) + } } case <-rd.stopChan: - if err := rd.c.Del(context.Background(), rd.nodeID, rd.nodeID).Err(); err != nil { - rd.logger.Errorf("unregister service node error %+v", err) + { + if err := rd.c.Del(context.Background(), rd.nodeID, rd.nodeID).Err(); err != nil { + rd.logger.Errorf("unregister service node error %+v", err) + } + return } - return } } } diff --git a/driver/v2/redisdriver_test.go b/driver/v2/redisdriver_test.go index b37fc3e..2667afa 100644 --- a/driver/v2/redisdriver_test.go +++ b/driver/v2/redisdriver_test.go @@ -1,6 +1,7 @@ package v2_test import ( + "log" "testing" "time" @@ -10,15 +11,20 @@ import ( "github.com/stretchr/testify/require" ) +func testFuncNewRedisDriver(addr string) driver.DriverV2 { + log.Println("redis=", addr) + redisCli := redis.NewClient(&redis.Options{ + Addr: addr, + }) + return driver.NewRedisDriver(redisCli) +} + func TestRedisDriver_GetNodes(t *testing.T) { rds := miniredis.RunT(t) drvs := make([]driver.DriverV2, 0) N := 10 for i := 0; i < N; i++ { - redisCli := redis.NewClient(&redis.Options{ - Addr: rds.Addr(), - }) - drv := driver.NewRedisDriver(redisCli) + drv := testFuncNewRedisDriver(rds.Addr()) drv.Init(t.Name(), 5*time.Second, nil) err := drv.Start() require.Nil(t, err) @@ -35,3 +41,43 @@ func TestRedisDriver_GetNodes(t *testing.T) { v.Stop() } } + +func TestRedisDriver_Stop(t *testing.T) { + var err error + var nodes []string + rds := miniredis.RunT(t) + drv1 := testFuncNewRedisDriver(rds.Addr()) + drv1.Init(t.Name(), 5*time.Second, nil) + + drv2 := testFuncNewRedisDriver(rds.Addr()) + drv2.Init(t.Name(), 5*time.Second, nil) + err = drv2.Start() + require.Nil(t, err) + + err = drv1.Start() + require.Nil(t, err) + + nodes, err = drv1.GetNodes() + require.Nil(t, err) + require.Len(t, nodes, 2) + + nodes, err = drv2.GetNodes() + require.Nil(t, err) + require.Len(t, nodes, 2) + + drv1.Stop() + + <-time.After(5 * time.Second) + nodes, err = drv2.GetNodes() + require.Nil(t, err) + require.Len(t, nodes, 1) + + err = drv1.Start() + require.Nil(t, err) + <-time.After(5 * time.Second) + nodes, err = drv2.GetNodes() + require.Nil(t, err) + require.Len(t, nodes, 2) + + drv2.Stop() +} diff --git a/driver/v2/util.go b/driver/v2/util.go index cd1d427..206f3dd 100644 --- a/driver/v2/util.go +++ b/driver/v2/util.go @@ -4,7 +4,6 @@ import "github.com/google/uuid" // GlobalKeyPrefix is global redis key preifx const GlobalKeyPrefix = "distributed-cron:" -const DefaultNodesChanLength = 10 func GetKeyPre(serviceName string) string { return GlobalKeyPrefix + serviceName + ":" diff --git a/go.mod b/go.mod index e878a78..0812b5d 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,10 @@ require ( github.com/alicebob/miniredis/v2 v2.30.1 github.com/go-redis/redis/v8 v8.11.5 github.com/google/uuid v1.1.2 + github.com/kr/text v0.2.0 // indirect github.com/robfig/cron/v3 v3.0.1 github.com/stretchr/testify v1.7.0 go.etcd.io/etcd/api/v3 v3.5.4 go.etcd.io/etcd/client/v3 v3.5.4 - go.etcd.io/etcd/tests/v3 v3.5.4 + golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect ) diff --git a/go.sum b/go.sum index 559aad9..047ade8 100644 --- a/go.sum +++ b/go.sum @@ -1,21 +1,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -26,23 +11,10 @@ github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGn github.com/alicebob/miniredis/v2 v2.30.1 h1:HM1rlQjq1bm9yQcsawJqSZBJ9AYgxvjkMsNtddh90+g= github.com/alicebob/miniredis/v2 v2.30.1/go.mod h1:b25qWj4fCEsBeAAR2mlb0ufImGC6uH3VlUfb/HS5zKg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -52,50 +24,26 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5 h1:xD/lrqdvwsc+O2bjSSi3YqY73Ke3LAiSCx49aCesA0E= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4 h1:Lap807SXTH5tri2TivECb/4abUkMZC9zRoLarvcKDqs= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -108,17 +56,10 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -132,13 +73,8 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -148,63 +84,19 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -216,34 +108,16 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= @@ -255,68 +129,33 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -325,101 +164,32 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE= github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd/api/v3 v3.5.4 h1:OHVyt3TopwtUQ2GKdd5wu3PmmipR4FTwCqoEjSyRdIc= go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/client/pkg/v3 v3.5.4 h1:lrneYvz923dvC14R54XcA7FXoZ3mlGZAgmwhfm7HqOg= go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.4 h1:Dcx3/MYyfKcPNLpR4VVQUP5KgYrBeJtktBwEKkw08Ao= -go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= go.etcd.io/etcd/client/v3 v3.5.4 h1:p83BUL3tAYS0OT/r0qglgc3M1JjhM0diV8DSWAhVXv4= go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= -go.etcd.io/etcd/etcdutl/v3 v3.5.4/go.mod h1:eK9eZfI/BxDQCztpuaJ1E/ufYpMw2Y16dPX1azGWrBU= -go.etcd.io/etcd/pkg/v3 v3.5.4 h1:V5Dvl7S39ZDwjkKqJG2BfXgxZ3QREqqKifWQgIw5IM0= -go.etcd.io/etcd/pkg/v3 v3.5.4/go.mod h1:OI+TtO+Aa3nhQSppMbwE4ld3uF1/fqqwbpfndbbrEe0= -go.etcd.io/etcd/raft/v3 v3.5.4 h1:YGrnAgRfgXloBNuqa+oBI/aRZMcK/1GS6trJePJ/Gqc= -go.etcd.io/etcd/raft/v3 v3.5.4/go.mod h1:SCuunjYvZFC0fBX0vxMSPjuZmpcSk+XaAcMrD6Do03w= -go.etcd.io/etcd/server/v3 v3.5.4 h1:CMAZd0g8Bn5NRhynW6pKhc4FRg41/0QYy3d7aNm9874= -go.etcd.io/etcd/server/v3 v3.5.4/go.mod h1:S5/YTU15KxymM5l3T6b09sNOHPXqGYIZStpuuGbb65c= -go.etcd.io/etcd/tests/v3 v3.5.4 h1:wiYG8vbDwZO2UatQE9Z3GIv2z52jGg5DvEkTDXm090c= -go.etcd.io/etcd/tests/v3 v3.5.4/go.mod h1:ymig8LjkI1zqAxxMsl+nntzG21dND2hh0UQXl9BaJP8= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 h1:sO4WKdPAudZGKPcpZT4MJn6JaDmpyLrMPDGGyA1SttE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/otel v0.20.0 h1:eaP0Fqu7SXHwvjiqDq83zImeehOHX8doTvU9AwXON8g= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0 h1:4kzhXFP+btKm4jwxpjIqjs41A7MakRFUS86bqLHTIw8= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0 h1:HiITxCawalo5vQzdHfKeZurV8x7ljcqAgiWzF6Vaeaw= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0 h1:JsxtGXd06J8jrnya7fdI/U/MR6yXA5DtbZy+qoHQlr8= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0 h1:c5VRjxCXdQlx1HjzwGdQHzZaVI82b5EbBgOu2ljD92g= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0 h1:7ao1wpzHRVKf0OQ7GIxiQJA6X7DLX9o14gmVon7mMK8= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0 h1:1DL6EXUdcg95gukhuRRvLDO/4X5THh/5dIV52lqtnbw= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 h1:71vQrMauZZhcTVK6KdYM+rklehEEwb3E+ZhaE5jrPrE= -golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -427,17 +197,11 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -445,52 +209,37 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -500,87 +249,44 @@ golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.2 h1:kRBLX7v7Af8W7Gdbbc908OJcdgtK8bOz9Uaj8/F1ACA= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -597,18 +303,11 @@ google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/l google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -622,10 +321,5 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From 53ac4f5e8729f61bec3308629568d8f6893df86f Mon Sep 17 00:00:00 2001 From: dxyinme Date: Sun, 16 Apr 2023 21:55:22 +0800 Subject: [PATCH 13/27] update etcdtest --- driver/v2/etcddriver.go | 6 + driver/v2/etcddriver_test.go | 46 +++++ go.mod | 9 +- go.sum | 341 +++++++++++++++++++++++++++++++++-- 4 files changed, 383 insertions(+), 19 deletions(-) diff --git a/driver/v2/etcddriver.go b/driver/v2/etcddriver.go index ea571eb..d08166c 100644 --- a/driver/v2/etcddriver.go +++ b/driver/v2/etcddriver.go @@ -164,6 +164,12 @@ label: e.logger.Errorf("ectd cli keepalive timeout") return } + case <-time.After(time.Duration(e.lease/2) * (time.Second)): + { + // if near to nodes time, + // renew the lease + goto label + } } } } diff --git a/driver/v2/etcddriver_test.go b/driver/v2/etcddriver_test.go index b0591ff..e912885 100644 --- a/driver/v2/etcddriver_test.go +++ b/driver/v2/etcddriver_test.go @@ -1 +1,47 @@ package v2_test + +import ( + "testing" + "time" + + "github.com/libi/dcron/driver" + v2 "github.com/libi/dcron/driver/v2" + "github.com/stretchr/testify/require" + clientv3 "go.etcd.io/etcd/client/v3" + "go.etcd.io/etcd/tests/v3/integration" +) + +func testFuncNewEtcdDriver(cfg clientv3.Config) driver.DriverV2 { + cli, err := clientv3.New(cfg) + if err != nil { + panic(err) + } + return v2.NewEtcdDriver(cli) +} + +func TestEtcdDriver_GetNodes(t *testing.T) { + etcdsvr := integration.NewLazyCluster() + defer etcdsvr.Terminate() + N := 10 + drvs := make([]driver.DriverV2, 0) + for i := 0; i < N; i++ { + drv := testFuncNewEtcdDriver(clientv3.Config{ + Endpoints: etcdsvr.EndpointsV3(), + DialTimeout: 3 * time.Second, + }) + drv.Init(t.Name(), 5*time.Second, nil) + err := drv.Start() + require.Nil(t, err) + drvs = append(drvs, drv) + } + <-time.After(5 * time.Second) + for _, v := range drvs { + nodes, err := v.GetNodes() + require.Nil(t, err) + require.Equal(t, N, len(nodes)) + } + + for _, v := range drvs { + v.Stop() + } +} diff --git a/go.mod b/go.mod index 0812b5d..bfe6602 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,9 @@ require ( github.com/alicebob/miniredis/v2 v2.30.1 github.com/go-redis/redis/v8 v8.11.5 github.com/google/uuid v1.1.2 - github.com/kr/text v0.2.0 // indirect github.com/robfig/cron/v3 v3.0.1 - github.com/stretchr/testify v1.7.0 - go.etcd.io/etcd/api/v3 v3.5.4 - go.etcd.io/etcd/client/v3 v3.5.4 - golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect + github.com/stretchr/testify v1.8.1 + go.etcd.io/etcd/api/v3 v3.5.8 + go.etcd.io/etcd/client/v3 v3.5.8 + go.etcd.io/etcd/tests/v3 v3.5.8 ) diff --git a/go.sum b/go.sum index 047ade8..dd84c1f 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,21 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -11,10 +26,20 @@ github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGn github.com/alicebob/miniredis/v2 v2.30.1 h1:HM1rlQjq1bm9yQcsawJqSZBJ9AYgxvjkMsNtddh90+g= github.com/alicebob/miniredis/v2 v2.30.1/go.mod h1:b25qWj4fCEsBeAAR2mlb0ufImGC6uH3VlUfb/HS5zKg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -24,26 +49,46 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -56,10 +101,18 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -73,30 +126,79 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -108,16 +210,34 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= @@ -129,79 +249,188 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE= github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= -go.etcd.io/etcd/api/v3 v3.5.4 h1:OHVyt3TopwtUQ2GKdd5wu3PmmipR4FTwCqoEjSyRdIc= -go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/client/pkg/v3 v3.5.4 h1:lrneYvz923dvC14R54XcA7FXoZ3mlGZAgmwhfm7HqOg= -go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v3 v3.5.4 h1:p83BUL3tAYS0OT/r0qglgc3M1JjhM0diV8DSWAhVXv4= -go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/etcd/api/v3 v3.5.8 h1:Zf44zJszoU7zRV0X/nStPenegNXoFDWcB/MwrJbA+L4= +go.etcd.io/etcd/api/v3 v3.5.8/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= +go.etcd.io/etcd/client/pkg/v3 v3.5.8 h1:tPp9YRn/UBFAHdhOQUII9eUs7aOK35eulpMhX4YBd+M= +go.etcd.io/etcd/client/pkg/v3 v3.5.8/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= +go.etcd.io/etcd/client/v2 v2.305.8 h1:IGp9Ozt8awy3qRTXSIYJd/o/cr4oUyrm9MF1RJ2dr/c= +go.etcd.io/etcd/client/v2 v2.305.8/go.mod h1:ZlAsxDK5/10I6xVHhFo9zinCMr/DDLKFetDDXlzKwqE= +go.etcd.io/etcd/client/v3 v3.5.8 h1:B6ngTKZSWWowHEoaucOKHQR/AtZKaoHLiUpWxOLG4l4= +go.etcd.io/etcd/client/v3 v3.5.8/go.mod h1:idZYIPVkttBJBiRigkB5EM0MmEyx8jcl18zCV3F5noc= +go.etcd.io/etcd/etcdutl/v3 v3.5.8/go.mod h1:ttDqxIhpW9PqQdw+jJhUpLF+f37TnnSRJpkJSkCikts= +go.etcd.io/etcd/pkg/v3 v3.5.8 h1:hz6w5Cb4p7dbt642m8Y35Ts9yWPWUCymc3v4Z/aiGEU= +go.etcd.io/etcd/pkg/v3 v3.5.8/go.mod h1:C17MJkZHJIyJV+wWWx6Jz6YS6BfdkOnUkSwT9uuEO7s= +go.etcd.io/etcd/raft/v3 v3.5.8 h1:wM4IAfiY1+vrCAkUicIOzkyjpV9MawnAul2KvxeMgy4= +go.etcd.io/etcd/raft/v3 v3.5.8/go.mod h1:W6P5WxtOMfYNdLSEJX3vc8Pg6LOt+ewI9UCFKcnIexA= +go.etcd.io/etcd/server/v3 v3.5.8 h1:eK9fU6Pd6IJD1k0u4zAq1NZsSsEOOimlP3kIkpcQrho= +go.etcd.io/etcd/server/v3 v3.5.8/go.mod h1:1y2ahPOrlE4pzVV5+rBCDur7QQcEP0MNUPO2dyzwjso= +go.etcd.io/etcd/tests/v3 v3.5.8 h1:jrWlrEJfFuvI9nqMGFZNLc+OCdtyBdw8mSfp8ZwLIWs= +go.etcd.io/etcd/tests/v3 v3.5.8/go.mod h1:KFgEgZWwXZILKsOX3f3VyGmUHQgbG/yM9edQNTkXsdE= +go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0 h1:Wx7nFnvCaissIUZxPkBqDz2963Z+Cl+PkYbDKzTxDqQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0/go.mod h1:E5NNboN0UqSAki0Atn9kVwaN7I+l25gGxDqBueo/74E= +go.opentelemetry.io/otel v1.0.1 h1:4XKyXmfqJLOQ7feyV5DB6gsBFZ0ltB8vLtp6pj4JIcc= +go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1 h1:ofMbch7i29qIUf7VtF+r0HRF6ac0SBaPSziSsKp7wkk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1 h1:CFMFNoz+CGprjFAFy+RJFrfEe4GBia3RRm2a4fREvCA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk= +go.opentelemetry.io/otel/sdk v1.0.1 h1:wXxFEWGo7XfXupPwVJvTBOaPBC9FEg0wB8hMNrKk+cA= +go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI= +go.opentelemetry.io/otel/trace v1.0.1 h1:StTeIH6Q3G4r0Fiw34LTokUFESZgIDUr0qIJ7mKmAfw= +go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4= +go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -209,31 +438,49 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -247,48 +494,100 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -299,15 +598,23 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -318,8 +625,14 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From 70b4fb74fd99522c9cfbb34bdf88647027fdc573 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Wed, 19 Apr 2023 20:59:57 +0800 Subject: [PATCH 14/27] fix go 1.16 build bug --- go.mod | 6 +-- go.sum | 149 ++++++++++++++++++++++++++++----------------------------- 2 files changed, 77 insertions(+), 78 deletions(-) diff --git a/go.mod b/go.mod index bfe6602..2f34839 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/google/uuid v1.1.2 github.com/robfig/cron/v3 v3.0.1 github.com/stretchr/testify v1.8.1 - go.etcd.io/etcd/api/v3 v3.5.8 - go.etcd.io/etcd/client/v3 v3.5.8 - go.etcd.io/etcd/tests/v3 v3.5.8 + go.etcd.io/etcd/api/v3 v3.5.4 + go.etcd.io/etcd/client/v3 v3.5.4 + go.etcd.io/etcd/tests/v3 v3.5.4 ) diff --git a/go.sum b/go.sum index dd84c1f..b35da92 100644 --- a/go.sum +++ b/go.sum @@ -29,15 +29,18 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg= +github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -49,10 +52,12 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5 h1:xD/lrqdvwsc+O2bjSSi3YqY73Ke3LAiSCx49aCesA0E= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4 h1:Lap807SXTH5tri2TivECb/4abUkMZC9zRoLarvcKDqs= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= @@ -79,14 +84,16 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -102,10 +109,9 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= -github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= @@ -139,9 +145,8 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -199,6 +204,7 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -333,50 +339,57 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE= github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd/api/v3 v3.5.8 h1:Zf44zJszoU7zRV0X/nStPenegNXoFDWcB/MwrJbA+L4= -go.etcd.io/etcd/api/v3 v3.5.8/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= -go.etcd.io/etcd/client/pkg/v3 v3.5.8 h1:tPp9YRn/UBFAHdhOQUII9eUs7aOK35eulpMhX4YBd+M= -go.etcd.io/etcd/client/pkg/v3 v3.5.8/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= -go.etcd.io/etcd/client/v2 v2.305.8 h1:IGp9Ozt8awy3qRTXSIYJd/o/cr4oUyrm9MF1RJ2dr/c= -go.etcd.io/etcd/client/v2 v2.305.8/go.mod h1:ZlAsxDK5/10I6xVHhFo9zinCMr/DDLKFetDDXlzKwqE= -go.etcd.io/etcd/client/v3 v3.5.8 h1:B6ngTKZSWWowHEoaucOKHQR/AtZKaoHLiUpWxOLG4l4= -go.etcd.io/etcd/client/v3 v3.5.8/go.mod h1:idZYIPVkttBJBiRigkB5EM0MmEyx8jcl18zCV3F5noc= -go.etcd.io/etcd/etcdutl/v3 v3.5.8/go.mod h1:ttDqxIhpW9PqQdw+jJhUpLF+f37TnnSRJpkJSkCikts= -go.etcd.io/etcd/pkg/v3 v3.5.8 h1:hz6w5Cb4p7dbt642m8Y35Ts9yWPWUCymc3v4Z/aiGEU= -go.etcd.io/etcd/pkg/v3 v3.5.8/go.mod h1:C17MJkZHJIyJV+wWWx6Jz6YS6BfdkOnUkSwT9uuEO7s= -go.etcd.io/etcd/raft/v3 v3.5.8 h1:wM4IAfiY1+vrCAkUicIOzkyjpV9MawnAul2KvxeMgy4= -go.etcd.io/etcd/raft/v3 v3.5.8/go.mod h1:W6P5WxtOMfYNdLSEJX3vc8Pg6LOt+ewI9UCFKcnIexA= -go.etcd.io/etcd/server/v3 v3.5.8 h1:eK9fU6Pd6IJD1k0u4zAq1NZsSsEOOimlP3kIkpcQrho= -go.etcd.io/etcd/server/v3 v3.5.8/go.mod h1:1y2ahPOrlE4pzVV5+rBCDur7QQcEP0MNUPO2dyzwjso= -go.etcd.io/etcd/tests/v3 v3.5.8 h1:jrWlrEJfFuvI9nqMGFZNLc+OCdtyBdw8mSfp8ZwLIWs= -go.etcd.io/etcd/tests/v3 v3.5.8/go.mod h1:KFgEgZWwXZILKsOX3f3VyGmUHQgbG/yM9edQNTkXsdE= -go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/etcd/api/v3 v3.5.4 h1:OHVyt3TopwtUQ2GKdd5wu3PmmipR4FTwCqoEjSyRdIc= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/client/pkg/v3 v3.5.4 h1:lrneYvz923dvC14R54XcA7FXoZ3mlGZAgmwhfm7HqOg= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.4 h1:Dcx3/MYyfKcPNLpR4VVQUP5KgYrBeJtktBwEKkw08Ao= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v3 v3.5.4 h1:p83BUL3tAYS0OT/r0qglgc3M1JjhM0diV8DSWAhVXv4= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.etcd.io/etcd/etcdutl/v3 v3.5.4/go.mod h1:eK9eZfI/BxDQCztpuaJ1E/ufYpMw2Y16dPX1azGWrBU= +go.etcd.io/etcd/pkg/v3 v3.5.4 h1:V5Dvl7S39ZDwjkKqJG2BfXgxZ3QREqqKifWQgIw5IM0= +go.etcd.io/etcd/pkg/v3 v3.5.4/go.mod h1:OI+TtO+Aa3nhQSppMbwE4ld3uF1/fqqwbpfndbbrEe0= +go.etcd.io/etcd/raft/v3 v3.5.4 h1:YGrnAgRfgXloBNuqa+oBI/aRZMcK/1GS6trJePJ/Gqc= +go.etcd.io/etcd/raft/v3 v3.5.4/go.mod h1:SCuunjYvZFC0fBX0vxMSPjuZmpcSk+XaAcMrD6Do03w= +go.etcd.io/etcd/server/v3 v3.5.4 h1:CMAZd0g8Bn5NRhynW6pKhc4FRg41/0QYy3d7aNm9874= +go.etcd.io/etcd/server/v3 v3.5.4/go.mod h1:S5/YTU15KxymM5l3T6b09sNOHPXqGYIZStpuuGbb65c= +go.etcd.io/etcd/tests/v3 v3.5.4 h1:wiYG8vbDwZO2UatQE9Z3GIv2z52jGg5DvEkTDXm090c= +go.etcd.io/etcd/tests/v3 v3.5.4/go.mod h1:ymig8LjkI1zqAxxMsl+nntzG21dND2hh0UQXl9BaJP8= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0 h1:Wx7nFnvCaissIUZxPkBqDz2963Z+Cl+PkYbDKzTxDqQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0/go.mod h1:E5NNboN0UqSAki0Atn9kVwaN7I+l25gGxDqBueo/74E= -go.opentelemetry.io/otel v1.0.1 h1:4XKyXmfqJLOQ7feyV5DB6gsBFZ0ltB8vLtp6pj4JIcc= -go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1 h1:ofMbch7i29qIUf7VtF+r0HRF6ac0SBaPSziSsKp7wkk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1 h1:CFMFNoz+CGprjFAFy+RJFrfEe4GBia3RRm2a4fREvCA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk= -go.opentelemetry.io/otel/sdk v1.0.1 h1:wXxFEWGo7XfXupPwVJvTBOaPBC9FEg0wB8hMNrKk+cA= -go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI= -go.opentelemetry.io/otel/trace v1.0.1 h1:StTeIH6Q3G4r0Fiw34LTokUFESZgIDUr0qIJ7mKmAfw= -go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= +go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 h1:sO4WKdPAudZGKPcpZT4MJn6JaDmpyLrMPDGGyA1SttE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/otel v0.20.0 h1:eaP0Fqu7SXHwvjiqDq83zImeehOHX8doTvU9AwXON8g= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/metric v0.20.0 h1:4kzhXFP+btKm4jwxpjIqjs41A7MakRFUS86bqLHTIw8= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/oteltest v0.20.0 h1:HiITxCawalo5vQzdHfKeZurV8x7ljcqAgiWzF6Vaeaw= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0 h1:JsxtGXd06J8jrnya7fdI/U/MR6yXA5DtbZy+qoHQlr8= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0 h1:c5VRjxCXdQlx1HjzwGdQHzZaVI82b5EbBgOu2ljD92g= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= +go.opentelemetry.io/otel/sdk/metric v0.20.0 h1:7ao1wpzHRVKf0OQ7GIxiQJA6X7DLX9o14gmVon7mMK8= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= +go.opentelemetry.io/otel/trace v0.20.0 h1:1DL6EXUdcg95gukhuRRvLDO/4X5THh/5dIV52lqtnbw= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4= -go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -390,9 +403,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 h1:71vQrMauZZhcTVK6KdYM+rklehEEwb3E+ZhaE5jrPrE= +golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -407,6 +419,7 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -416,7 +429,6 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -439,13 +451,10 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -459,9 +468,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -487,6 +495,7 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -494,34 +503,26 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -537,14 +538,15 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.2 h1:kRBLX7v7Af8W7Gdbbc908OJcdgtK8bOz9Uaj8/F1ACA= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -583,11 +585,9 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -598,9 +598,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 0ab50d47cb4a75b616764aa67e07390cebe05474 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Thu, 20 Apr 2023 20:56:44 +0800 Subject: [PATCH 15/27] finished etcd driver test --- driver/v2/etcddriver_test.go | 48 ++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/driver/v2/etcddriver_test.go b/driver/v2/etcddriver_test.go index e912885..46b104f 100644 --- a/driver/v2/etcddriver_test.go +++ b/driver/v2/etcddriver_test.go @@ -45,3 +45,51 @@ func TestEtcdDriver_GetNodes(t *testing.T) { v.Stop() } } + +func TestEtcdDriver_Stop(t *testing.T) { + var err error + var nodes []string + etcdsvr := integration.NewLazyCluster() + defer etcdsvr.Terminate() + + drv1 := testFuncNewEtcdDriver(clientv3.Config{ + Endpoints: etcdsvr.EndpointsV3(), + DialTimeout: 3 * time.Second, + }) + drv1.Init(t.Name(), 5*time.Second, nil) + + drv2 := testFuncNewEtcdDriver(clientv3.Config{ + Endpoints: etcdsvr.EndpointsV3(), + DialTimeout: 3 * time.Second, + }) + drv2.Init(t.Name(), 5*time.Second, nil) + err = drv2.Start() + require.Nil(t, err) + + err = drv1.Start() + require.Nil(t, err) + <-time.After(3 * time.Second) + nodes, err = drv1.GetNodes() + require.Nil(t, err) + require.Len(t, nodes, 2) + + nodes, err = drv2.GetNodes() + require.Nil(t, err) + require.Len(t, nodes, 2) + + drv1.Stop() + + <-time.After(5 * time.Second) + nodes, err = drv2.GetNodes() + require.Nil(t, err) + require.Len(t, nodes, 1) + + err = drv1.Start() + require.Nil(t, err) + <-time.After(5 * time.Second) + nodes, err = drv2.GetNodes() + require.Nil(t, err) + require.Len(t, nodes, 2) + + drv2.Stop() +} From fa4bd46d67c1d9b92bc2a745ab49eef9315da06c Mon Sep 17 00:00:00 2001 From: dxyinme Date: Sat, 22 Apr 2023 22:48:35 +0800 Subject: [PATCH 16/27] add comment, change the code structure --- dlog/logger.go | 28 +++++++++++++++++++-- driver/driver.go | 17 +++++++------ driver/{v2 => }/etcddriver.go | 38 ++++++++++++++++++----------- driver/{v2 => }/etcddriver_test.go | 12 ++++----- driver/option.go | 26 ++++++++++++++++++++ driver/{v2 => }/redisdriver.go | 33 +++++++++++++++++++------ driver/{v2 => }/redisdriver_test.go | 16 +++++++++--- driver/{v2 => }/util.go | 2 +- 8 files changed, 130 insertions(+), 42 deletions(-) rename driver/{v2 => }/etcddriver.go (84%) rename driver/{v2 => }/etcddriver_test.go (81%) create mode 100644 driver/option.go rename driver/{v2 => }/redisdriver.go (80%) rename driver/{v2 => }/redisdriver_test.go (79%) rename driver/{v2 => }/util.go (97%) diff --git a/dlog/logger.go b/dlog/logger.go index 98857f1..168b61a 100644 --- a/dlog/logger.go +++ b/dlog/logger.go @@ -1,11 +1,17 @@ package dlog -import "log" +import ( + "testing" +) type PrintfLogger interface { Printf(string, ...interface{}) } +type LogfLogger interface { + Logf(string, ...interface{}) +} + type Logger interface { PrintfLogger Infof(string, ...interface{}) @@ -14,7 +20,7 @@ type Logger interface { } type StdLogger struct { - Log *log.Logger + Log PrintfLogger } func (l *StdLogger) Infof(format string, args ...interface{}) { @@ -32,3 +38,21 @@ func (l *StdLogger) Errorf(format string, args ...interface{}) { func (l *StdLogger) Printf(format string, args ...interface{}) { l.Log.Printf(format, args...) } + +type PrintfLoggerFromLogfLogger struct { + Log LogfLogger +} + +func (l *PrintfLoggerFromLogfLogger) Printf(fmt string, args ...interface{}) { + l.Log.Logf(fmt, args) +} + +func NewPrintfLoggerFromLogfLogger(logger LogfLogger) PrintfLogger { + return &PrintfLoggerFromLogfLogger{Log: logger} +} + +func NewLoggerForTest(t *testing.T) Logger { + return &StdLogger{ + Log: NewPrintfLoggerFromLogfLogger(t), + } +} diff --git a/driver/driver.go b/driver/driver.go index 7260414..4cacded 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -1,30 +1,31 @@ package driver import ( - "time" - "github.com/go-redis/redis/v8" - "github.com/libi/dcron/dlog" - v2 "github.com/libi/dcron/driver/v2" clientv3 "go.etcd.io/etcd/client/v3" ) -// there is only one driver for one dcron. +// There is only one driver for one dcron. +// Tips for write a user-defined Driver by yourself. +// 1. Confirm that `Stop` and `Start` can be called for more times. +// 2. Must make `GetNodes` will return error when timeout. type DriverV2 interface { // init driver - Init(serviceName string, timeout time.Duration, logger dlog.Logger) + Init(serviceName string, opts ...Option) // get nodeID NodeID() string // get nodes GetNodes() (nodes []string, err error) Start() (err error) Stop() (err error) + + withOption(opt Option) (err error) } func NewRedisDriver(redisClient *redis.Client) DriverV2 { - return v2.NewRedisDriver(redisClient) + return newRedisDriver(redisClient) } func NewEtcdDriver(etcdCli *clientv3.Client) DriverV2 { - return v2.NewEtcdDriver(etcdCli) + return newEtcdDriver(etcdCli) } diff --git a/driver/v2/etcddriver.go b/driver/etcddriver.go similarity index 84% rename from driver/v2/etcddriver.go rename to driver/etcddriver.go index d08166c..9c5d7b8 100644 --- a/driver/v2/etcddriver.go +++ b/driver/etcddriver.go @@ -1,4 +1,4 @@ -package v2 +package driver import ( "context" @@ -12,9 +12,9 @@ import ( ) const ( - defaultLease = 5 // min lease time - dialTimeout = 3 * time.Second - businessTimeout = 5 * time.Second + etcdDefaultLease = 5 // min lease time + etcdDialTimeout = 3 * time.Second + etcdBusinessTimeout = 5 * time.Second ) type EtcdDriver struct { @@ -31,7 +31,7 @@ type EtcdDriver struct { } //NewEtcdDriver -func NewEtcdDriver(cli *clientv3.Client) *EtcdDriver { +func newEtcdDriver(cli *clientv3.Client) *EtcdDriver { ser := &EtcdDriver{ cli: cli, nodes: &sync.Map{}, @@ -46,11 +46,11 @@ func NewEtcdDriver(cli *clientv3.Client) *EtcdDriver { //设置key value,绑定租约 func (e *EtcdDriver) putKeyWithLease(key, val string) (clientv3.LeaseID, error) { //设置租约时间,最少5s - if e.lease < defaultLease { - e.lease = defaultLease + if e.lease < etcdDefaultLease { + e.lease = etcdDefaultLease } - ctx, cancel := context.WithTimeout(context.Background(), businessTimeout) + ctx, cancel := context.WithTimeout(context.Background(), etcdBusinessTimeout) defer cancel() resp, err := e.cli.Grant(ctx, e.lease) if err != nil { @@ -159,7 +159,7 @@ label: goto label } } - case <-time.After(businessTimeout): + case <-time.After(etcdBusinessTimeout): { e.logger.Errorf("ectd cli keepalive timeout") return @@ -174,13 +174,9 @@ label: } } -func (e *EtcdDriver) Init(serverName string, timeout time.Duration, logger dlog.Logger) { +func (e *EtcdDriver) Init(serverName string, opts ...Option) { e.serviceName = serverName e.nodeID = GetNodeId(serverName) - e.lease = int64(timeout.Seconds()) - if logger != nil { - e.logger = logger - } } func (e *EtcdDriver) NodeID() string { @@ -205,3 +201,17 @@ func (e *EtcdDriver) Stop() (err error) { close(e.stopChan) return } + +func (e *EtcdDriver) withOption(opt Option) (err error) { + switch opt.Type() { + case OptionTypeTimeout: + { + e.lease = int64(opt.(TimeoutOption).timeout.Seconds()) + } + case OptionTypeLogger: + { + e.logger = opt.(LoggerOption).logger + } + } + return +} diff --git a/driver/v2/etcddriver_test.go b/driver/etcddriver_test.go similarity index 81% rename from driver/v2/etcddriver_test.go rename to driver/etcddriver_test.go index 46b104f..cfdda62 100644 --- a/driver/v2/etcddriver_test.go +++ b/driver/etcddriver_test.go @@ -1,11 +1,11 @@ -package v2_test +package driver_test import ( "testing" "time" + "github.com/libi/dcron/dlog" "github.com/libi/dcron/driver" - v2 "github.com/libi/dcron/driver/v2" "github.com/stretchr/testify/require" clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/tests/v3/integration" @@ -16,7 +16,7 @@ func testFuncNewEtcdDriver(cfg clientv3.Config) driver.DriverV2 { if err != nil { panic(err) } - return v2.NewEtcdDriver(cli) + return driver.NewEtcdDriver(cli) } func TestEtcdDriver_GetNodes(t *testing.T) { @@ -29,7 +29,7 @@ func TestEtcdDriver_GetNodes(t *testing.T) { Endpoints: etcdsvr.EndpointsV3(), DialTimeout: 3 * time.Second, }) - drv.Init(t.Name(), 5*time.Second, nil) + drv.Init(t.Name(), driver.NewTimeoutOption(5*time.Second), driver.NewLoggerOption(dlog.NewLoggerForTest(t))) err := drv.Start() require.Nil(t, err) drvs = append(drvs, drv) @@ -56,13 +56,13 @@ func TestEtcdDriver_Stop(t *testing.T) { Endpoints: etcdsvr.EndpointsV3(), DialTimeout: 3 * time.Second, }) - drv1.Init(t.Name(), 5*time.Second, nil) + drv1.Init(t.Name(), driver.NewTimeoutOption(5*time.Second), driver.NewLoggerOption(dlog.NewLoggerForTest(t))) drv2 := testFuncNewEtcdDriver(clientv3.Config{ Endpoints: etcdsvr.EndpointsV3(), DialTimeout: 3 * time.Second, }) - drv2.Init(t.Name(), 5*time.Second, nil) + drv2.Init(t.Name(), driver.NewTimeoutOption(5*time.Second), driver.NewLoggerOption(dlog.NewLoggerForTest(t))) err = drv2.Start() require.Nil(t, err) diff --git a/driver/option.go b/driver/option.go new file mode 100644 index 0000000..a2a15d1 --- /dev/null +++ b/driver/option.go @@ -0,0 +1,26 @@ +package driver + +import ( + "time" + + "github.com/libi/dcron/dlog" +) + +const ( + OptionTypeTimeout = 0x600 + OptionTypeLogger = 0x601 +) + +type Option interface { + Type() int +} + +type TimeoutOption struct{ timeout time.Duration } + +func (to TimeoutOption) Type() int { return OptionTypeTimeout } +func NewTimeoutOption(timeout time.Duration) TimeoutOption { return TimeoutOption{timeout: timeout} } + +type LoggerOption struct{ logger dlog.Logger } + +func (to LoggerOption) Type() int { return OptionTypeLogger } +func NewLoggerOption(logger dlog.Logger) LoggerOption { return LoggerOption{logger: logger} } diff --git a/driver/v2/redisdriver.go b/driver/redisdriver.go similarity index 80% rename from driver/v2/redisdriver.go rename to driver/redisdriver.go index fc19d18..5860389 100644 --- a/driver/v2/redisdriver.go +++ b/driver/redisdriver.go @@ -1,4 +1,4 @@ -package v2 +package driver import ( "context" @@ -12,6 +12,10 @@ import ( "github.com/libi/dcron/dlog" ) +const ( + redisDefaultTimeout = 5 * time.Second +) + type RedisDriver struct { c *redis.Client serviceName string @@ -24,24 +28,25 @@ type RedisDriver struct { sync.Mutex } -func NewRedisDriver(redisClient *redis.Client) *RedisDriver { +func newRedisDriver(redisClient *redis.Client) *RedisDriver { rd := &RedisDriver{ c: redisClient, logger: &dlog.StdLogger{ Log: log.Default(), }, + timeout: redisDefaultTimeout, } rd.started = false return rd } -func (rd *RedisDriver) Init(serviceName string, timeout time.Duration, logger dlog.Logger) { +func (rd *RedisDriver) Init(serviceName string, opts ...Option) { rd.serviceName = serviceName - rd.timeout = timeout - if logger != nil { - rd.logger = logger - } rd.nodeID = GetNodeId(rd.serviceName) + + for _, opt := range opts { + rd.withOption(opt) + } } func (rd *RedisDriver) NodeID() string { @@ -121,3 +126,17 @@ func (rd *RedisDriver) scan(matchStr string) ([]string, error) { } return ret, nil } + +func (rd *RedisDriver) withOption(opt Option) (err error) { + switch opt.Type() { + case OptionTypeTimeout: + { + rd.timeout = opt.(TimeoutOption).timeout + } + case OptionTypeLogger: + { + rd.logger = opt.(LoggerOption).logger + } + } + return +} diff --git a/driver/v2/redisdriver_test.go b/driver/redisdriver_test.go similarity index 79% rename from driver/v2/redisdriver_test.go rename to driver/redisdriver_test.go index 2667afa..6fc84b8 100644 --- a/driver/v2/redisdriver_test.go +++ b/driver/redisdriver_test.go @@ -1,4 +1,4 @@ -package v2_test +package driver_test import ( "log" @@ -7,6 +7,7 @@ import ( "github.com/alicebob/miniredis/v2" "github.com/go-redis/redis/v8" + "github.com/libi/dcron/dlog" "github.com/libi/dcron/driver" "github.com/stretchr/testify/require" ) @@ -25,7 +26,10 @@ func TestRedisDriver_GetNodes(t *testing.T) { N := 10 for i := 0; i < N; i++ { drv := testFuncNewRedisDriver(rds.Addr()) - drv.Init(t.Name(), 5*time.Second, nil) + drv.Init( + t.Name(), + driver.NewTimeoutOption(5*time.Second), + driver.NewLoggerOption(dlog.NewLoggerForTest(t))) err := drv.Start() require.Nil(t, err) drvs = append(drvs, drv) @@ -47,10 +51,14 @@ func TestRedisDriver_Stop(t *testing.T) { var nodes []string rds := miniredis.RunT(t) drv1 := testFuncNewRedisDriver(rds.Addr()) - drv1.Init(t.Name(), 5*time.Second, nil) + drv1.Init(t.Name(), + driver.NewTimeoutOption(5*time.Second), + driver.NewLoggerOption(dlog.NewLoggerForTest(t))) drv2 := testFuncNewRedisDriver(rds.Addr()) - drv2.Init(t.Name(), 5*time.Second, nil) + drv2.Init(t.Name(), + driver.NewTimeoutOption(5*time.Second), + driver.NewLoggerOption(dlog.NewLoggerForTest(t))) err = drv2.Start() require.Nil(t, err) diff --git a/driver/v2/util.go b/driver/util.go similarity index 97% rename from driver/v2/util.go rename to driver/util.go index 206f3dd..f3dfc10 100644 --- a/driver/v2/util.go +++ b/driver/util.go @@ -1,4 +1,4 @@ -package v2 +package driver import "github.com/google/uuid" From a999a783cba7509c302062d2e9b76ea79c6cdce6 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Sat, 22 Apr 2023 22:59:15 +0800 Subject: [PATCH 17/27] update --- node_pool.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/node_pool.go b/node_pool.go index c611ce7..77421f2 100644 --- a/node_pool.go +++ b/node_pool.go @@ -28,10 +28,10 @@ type NodePool struct { preNodes []string // sorted } -func newNodePool(serviceName string, driver driver.DriverV2, updateDuration time.Duration, hashReplicas int, logger dlog.Logger) *NodePool { +func newNodePool(serviceName string, drv driver.DriverV2, updateDuration time.Duration, hashReplicas int, logger dlog.Logger) *NodePool { np := &NodePool{ serviceName: serviceName, - driver: driver, + driver: drv, hashReplicas: hashReplicas, updateDuration: updateDuration, logger: &dlog.StdLogger{ @@ -42,7 +42,9 @@ func newNodePool(serviceName string, driver driver.DriverV2, updateDuration time if logger != nil { np.logger = logger } - np.driver.Init(serviceName, updateDuration, np.logger) + np.driver.Init(serviceName, + driver.NewTimeoutOption(updateDuration), + driver.NewLoggerOption(np.logger)) return np } From a2c7cf4b3b708da3b8bf093ae92f53358a9f5fd6 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Fri, 5 May 2023 19:39:36 +0800 Subject: [PATCH 18/27] update driver context --- driver/driver.go | 8 +++++--- driver/etcddriver.go | 6 +++--- driver/etcddriver_test.go | 25 +++++++++++++------------ driver/redisdriver.go | 6 +++--- driver/redisdriver_test.go | 25 +++++++++++++------------ node_pool.go | 9 +++++---- 6 files changed, 42 insertions(+), 37 deletions(-) diff --git a/driver/driver.go b/driver/driver.go index 4cacded..88e88ec 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -1,6 +1,8 @@ package driver import ( + "context" + "github.com/go-redis/redis/v8" clientv3 "go.etcd.io/etcd/client/v3" ) @@ -15,9 +17,9 @@ type DriverV2 interface { // get nodeID NodeID() string // get nodes - GetNodes() (nodes []string, err error) - Start() (err error) - Stop() (err error) + GetNodes(ctx context.Context) (nodes []string, err error) + Start(ctx context.Context) (err error) + Stop(ctx context.Context) (err error) withOption(opt Option) (err error) } diff --git a/driver/etcddriver.go b/driver/etcddriver.go index 9c5d7b8..3dae65b 100644 --- a/driver/etcddriver.go +++ b/driver/etcddriver.go @@ -183,11 +183,11 @@ func (e *EtcdDriver) NodeID() string { return e.nodeID } -func (e *EtcdDriver) GetNodes() (nodes []string, err error) { +func (e *EtcdDriver) GetNodes(ctx context.Context) (nodes []string, err error) { return e.getServices(), nil } -func (e *EtcdDriver) Start() (err error) { +func (e *EtcdDriver) Start(ctx context.Context) (err error) { e.stopChan = make(chan int, 1) go e.heartBeat() err = e.watchService(e.serviceName) @@ -197,7 +197,7 @@ func (e *EtcdDriver) Start() (err error) { return nil } -func (e *EtcdDriver) Stop() (err error) { +func (e *EtcdDriver) Stop(ctx context.Context) (err error) { close(e.stopChan) return } diff --git a/driver/etcddriver_test.go b/driver/etcddriver_test.go index cfdda62..e0f8225 100644 --- a/driver/etcddriver_test.go +++ b/driver/etcddriver_test.go @@ -1,6 +1,7 @@ package driver_test import ( + "context" "testing" "time" @@ -30,19 +31,19 @@ func TestEtcdDriver_GetNodes(t *testing.T) { DialTimeout: 3 * time.Second, }) drv.Init(t.Name(), driver.NewTimeoutOption(5*time.Second), driver.NewLoggerOption(dlog.NewLoggerForTest(t))) - err := drv.Start() + err := drv.Start(context.Background()) require.Nil(t, err) drvs = append(drvs, drv) } <-time.After(5 * time.Second) for _, v := range drvs { - nodes, err := v.GetNodes() + nodes, err := v.GetNodes(context.Background()) require.Nil(t, err) require.Equal(t, N, len(nodes)) } for _, v := range drvs { - v.Stop() + v.Stop(context.Background()) } } @@ -63,33 +64,33 @@ func TestEtcdDriver_Stop(t *testing.T) { DialTimeout: 3 * time.Second, }) drv2.Init(t.Name(), driver.NewTimeoutOption(5*time.Second), driver.NewLoggerOption(dlog.NewLoggerForTest(t))) - err = drv2.Start() + err = drv2.Start(context.Background()) require.Nil(t, err) - err = drv1.Start() + err = drv1.Start(context.Background()) require.Nil(t, err) <-time.After(3 * time.Second) - nodes, err = drv1.GetNodes() + nodes, err = drv1.GetNodes(context.Background()) require.Nil(t, err) require.Len(t, nodes, 2) - nodes, err = drv2.GetNodes() + nodes, err = drv2.GetNodes(context.Background()) require.Nil(t, err) require.Len(t, nodes, 2) - drv1.Stop() + drv1.Stop(context.Background()) <-time.After(5 * time.Second) - nodes, err = drv2.GetNodes() + nodes, err = drv2.GetNodes(context.Background()) require.Nil(t, err) require.Len(t, nodes, 1) - err = drv1.Start() + err = drv1.Start(context.Background()) require.Nil(t, err) <-time.After(5 * time.Second) - nodes, err = drv2.GetNodes() + nodes, err = drv2.GetNodes(context.Background()) require.Nil(t, err) require.Len(t, nodes, 2) - drv2.Stop() + drv2.Stop(context.Background()) } diff --git a/driver/redisdriver.go b/driver/redisdriver.go index 5860389..10886ab 100644 --- a/driver/redisdriver.go +++ b/driver/redisdriver.go @@ -53,7 +53,7 @@ func (rd *RedisDriver) NodeID() string { return rd.nodeID } -func (rd *RedisDriver) Start() (err error) { +func (rd *RedisDriver) Start(ctx context.Context) (err error) { rd.Lock() defer rd.Unlock() if rd.started { @@ -73,7 +73,7 @@ func (rd *RedisDriver) Start() (err error) { return } -func (rd *RedisDriver) Stop() (err error) { +func (rd *RedisDriver) Stop(ctx context.Context) (err error) { rd.Lock() defer rd.Unlock() close(rd.stopChan) @@ -81,7 +81,7 @@ func (rd *RedisDriver) Stop() (err error) { return } -func (rd *RedisDriver) GetNodes() (nodes []string, err error) { +func (rd *RedisDriver) GetNodes(ctx context.Context) (nodes []string, err error) { mathStr := fmt.Sprintf("%s*", GetKeyPre(rd.serviceName)) return rd.scan(mathStr) } diff --git a/driver/redisdriver_test.go b/driver/redisdriver_test.go index 6fc84b8..2761f0b 100644 --- a/driver/redisdriver_test.go +++ b/driver/redisdriver_test.go @@ -1,6 +1,7 @@ package driver_test import ( + "context" "log" "testing" "time" @@ -30,19 +31,19 @@ func TestRedisDriver_GetNodes(t *testing.T) { t.Name(), driver.NewTimeoutOption(5*time.Second), driver.NewLoggerOption(dlog.NewLoggerForTest(t))) - err := drv.Start() + err := drv.Start(context.Background()) require.Nil(t, err) drvs = append(drvs, drv) } for _, v := range drvs { - nodes, err := v.GetNodes() + nodes, err := v.GetNodes(context.Background()) require.Nil(t, err) require.Equal(t, N, len(nodes)) } for _, v := range drvs { - v.Stop() + v.Stop(context.Background()) } } @@ -59,33 +60,33 @@ func TestRedisDriver_Stop(t *testing.T) { drv2.Init(t.Name(), driver.NewTimeoutOption(5*time.Second), driver.NewLoggerOption(dlog.NewLoggerForTest(t))) - err = drv2.Start() + err = drv2.Start(context.Background()) require.Nil(t, err) - err = drv1.Start() + err = drv1.Start(context.Background()) require.Nil(t, err) - nodes, err = drv1.GetNodes() + nodes, err = drv1.GetNodes(context.Background()) require.Nil(t, err) require.Len(t, nodes, 2) - nodes, err = drv2.GetNodes() + nodes, err = drv2.GetNodes(context.Background()) require.Nil(t, err) require.Len(t, nodes, 2) - drv1.Stop() + drv1.Stop(context.Background()) <-time.After(5 * time.Second) - nodes, err = drv2.GetNodes() + nodes, err = drv2.GetNodes(context.Background()) require.Nil(t, err) require.Len(t, nodes, 1) - err = drv1.Start() + err = drv1.Start(context.Background()) require.Nil(t, err) <-time.After(5 * time.Second) - nodes, err = drv2.GetNodes() + nodes, err = drv2.GetNodes(context.Background()) require.Nil(t, err) require.Len(t, nodes, 2) - drv2.Stop() + drv2.Stop(context.Background()) } diff --git a/node_pool.go b/node_pool.go index 77421f2..0872973 100644 --- a/node_pool.go +++ b/node_pool.go @@ -1,6 +1,7 @@ package dcron import ( + "context" "log" "sync" "time" @@ -49,13 +50,13 @@ func newNodePool(serviceName string, drv driver.DriverV2, updateDuration time.Du } func (np *NodePool) StartPool() (err error) { - err = np.driver.Start() + err = np.driver.Start(context.Background()) if err != nil { np.logger.Errorf("start pool error: %v", err) return } np.NodeID = np.driver.NodeID() - nowNodes, err := np.driver.GetNodes() + nowNodes, err := np.driver.GetNodes(context.Background()) if err != nil { np.logger.Errorf("get nodes error: %v", err) return @@ -84,7 +85,7 @@ func (np *NodePool) CheckJobAvailable(jobName string) bool { func (np *NodePool) Stop() { np.stopChan <- 1 - np.driver.Stop() + np.driver.Stop(context.Background()) np.preNodes = make([]string, 0) } @@ -93,7 +94,7 @@ func (np *NodePool) waitingForHashRing() { for { select { case <-tick.C: - nowNodes, err := np.driver.GetNodes() + nowNodes, err := np.driver.GetNodes(context.Background()) if err != nil { np.logger.Errorf("get nodes error %v", err) continue From 94caec1259b1e30e01489620f2343f746d48d95a Mon Sep 17 00:00:00 2001 From: dxyinme Date: Sun, 7 May 2023 16:30:39 +0800 Subject: [PATCH 19/27] update --- dcron.go | 4 ++-- driver/redisdriver.go | 5 ++--- node_pool.go | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/dcron.go b/dcron.go index 88a23c9..4645a69 100644 --- a/dcron.go +++ b/dcron.go @@ -52,7 +52,7 @@ func NewDcron(serverName string, driver driver.DriverV2, cronOpts ...cron.Option dcron.crOptions = cronOpts dcron.cr = cron.New(cronOpts...) dcron.running = dcronStopped - dcron.nodePool = newNodePool(serverName, driver, dcron.nodeUpdateDuration, dcron.hashReplicas, dcron.logger) + dcron.nodePool = NewNodePool(serverName, driver, dcron.nodeUpdateDuration, dcron.hashReplicas, dcron.logger) return dcron } @@ -64,7 +64,7 @@ func NewDcronWithOption(serverName string, driver driver.DriverV2, dcronOpts ... } dcron.cr = cron.New(dcron.crOptions...) - dcron.nodePool = newNodePool(serverName, driver, dcron.nodeUpdateDuration, dcron.hashReplicas, dcron.logger) + dcron.nodePool = NewNodePool(serverName, driver, dcron.nodeUpdateDuration, dcron.hashReplicas, dcron.logger) return dcron } diff --git a/driver/redisdriver.go b/driver/redisdriver.go index 10886ab..efe68ed 100644 --- a/driver/redisdriver.go +++ b/driver/redisdriver.go @@ -83,7 +83,7 @@ func (rd *RedisDriver) Stop(ctx context.Context) (err error) { func (rd *RedisDriver) GetNodes(ctx context.Context) (nodes []string, err error) { mathStr := fmt.Sprintf("%s*", GetKeyPre(rd.serviceName)) - return rd.scan(mathStr) + return rd.scan(ctx, mathStr) } // private function @@ -113,9 +113,8 @@ func (rd *RedisDriver) registerServiceNode() error { return rd.c.SetEX(context.Background(), rd.nodeID, rd.nodeID, rd.timeout).Err() } -func (rd *RedisDriver) scan(matchStr string) ([]string, error) { +func (rd *RedisDriver) scan(ctx context.Context, matchStr string) ([]string, error) { ret := make([]string, 0) - ctx := context.Background() iter := rd.c.Scan(ctx, 0, matchStr, -1).Iterator() for iter.Next(ctx) { err := iter.Err() diff --git a/node_pool.go b/node_pool.go index 0872973..7ecb0e6 100644 --- a/node_pool.go +++ b/node_pool.go @@ -29,7 +29,7 @@ type NodePool struct { preNodes []string // sorted } -func newNodePool(serviceName string, drv driver.DriverV2, updateDuration time.Duration, hashReplicas int, logger dlog.Logger) *NodePool { +func NewNodePool(serviceName string, drv driver.DriverV2, updateDuration time.Duration, hashReplicas int, logger dlog.Logger) *NodePool { np := &NodePool{ serviceName: serviceName, driver: drv, From 4a168340a7037b28878e29e7a1584a632d5da96d Mon Sep 17 00:00:00 2001 From: dxyinme Date: Sun, 7 May 2023 16:57:11 +0800 Subject: [PATCH 20/27] fix test --- dcron_test.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/dcron_test.go b/dcron_test.go index cba3e14..b6e9392 100644 --- a/dcron_test.go +++ b/dcron_test.go @@ -31,16 +31,20 @@ func (t TestJob1) Run() { var testData = make(map[string]struct{}) func TestMultiNodes(t *testing.T) { - go runNode(t) + wg := &sync.WaitGroup{} + wg.Add(3) + + go runNode(t, wg) // 间隔1秒启动测试节点刷新逻辑 time.Sleep(time.Second) - go runNode(t) + go runNode(t, wg) time.Sleep(time.Second) - go runNode(t) - time.Sleep(120 * time.Second) + go runNode(t, wg) + + wg.Wait() } -func runNode(t *testing.T) { +func runNode(t *testing.T, wg *sync.WaitGroup) { redisCli := redis.NewClient(&redis.Options{ Addr: DefaultRedisAddr, }) @@ -82,6 +86,9 @@ func runNode(t *testing.T) { //移除测试 dcron.Remove("s1 test3") + <-time.After(120 * time.Second) + wg.Done() + dcron.Stop() } func Test_SecondsJob(t *testing.T) { From c19bf08ccde3ba5e6f4fb4852d5656093d63dc59 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Wed, 10 May 2023 23:11:15 +0800 Subject: [PATCH 21/27] add nodepool test --- dcron.go | 13 ++++--- inodepool.go | 11 ++++++ inodepool_test.go | 75 +++++++++++++++++++++++++++++++++++++ node_pool.go => nodepool.go | 27 +++++++------ 4 files changed, 109 insertions(+), 17 deletions(-) create mode 100644 inodepool.go create mode 100644 inodepool_test.go rename node_pool.go => nodepool.go (83%) diff --git a/dcron.go b/dcron.go index 4645a69..b5a74de 100644 --- a/dcron.go +++ b/dcron.go @@ -1,6 +1,7 @@ package dcron import ( + "context" "errors" "log" "os" @@ -31,7 +32,7 @@ type Dcron struct { jobsRWMut sync.Mutex ServerName string - nodePool *NodePool + nodePool INodePool running int32 logger dlog.Logger @@ -102,7 +103,7 @@ func (d *Dcron) AddFunc(jobName, cronStr string, cmd func()) (err error) { return d.addJob(jobName, cronStr, cmd, nil) } func (d *Dcron) addJob(jobName, cronStr string, cmd func(), job Job) (err error) { - d.logger.Infof("addJob '%s' : %s", jobName, cronStr) + d.logger.Infof("addJob '%s' : %s", jobName, cronStr) d.jobsRWMut.Lock() defer d.jobsRWMut.Unlock() @@ -153,7 +154,7 @@ func (d *Dcron) Start() { return } d.cr.Start() - d.logger.Infof("dcron started , nodeID is %s", d.nodePool.NodeID) + d.logger.Infof("dcron started , nodeID is %s", d.nodePool.GetNodeID()) } else { d.logger.Infof("dcron have started") } @@ -171,7 +172,7 @@ func (d *Dcron) Run() { return } - d.logger.Infof("dcron running nodeID is %s", d.nodePool.NodeID) + d.logger.Infof("dcron running nodeID is %s", d.nodePool.GetNodeID()) d.cr.Run() } else { d.logger.Infof("dcron already running") @@ -179,7 +180,7 @@ func (d *Dcron) Run() { } func (d *Dcron) startNodePool() error { - if err := d.nodePool.StartPool(); err != nil { + if err := d.nodePool.Start(context.Background()); err != nil { d.logger.Errorf("dcron start node pool error %+v", err) return err } @@ -189,7 +190,7 @@ func (d *Dcron) startNodePool() error { // Stop job func (d *Dcron) Stop() { tick := time.NewTicker(time.Millisecond) - d.nodePool.Stop() + d.nodePool.Stop(context.Background()) for range tick.C { if atomic.CompareAndSwapInt32(&d.running, dcronRunning, dcronStopped) { d.cr.Stop() diff --git a/inodepool.go b/inodepool.go new file mode 100644 index 0000000..baa59f1 --- /dev/null +++ b/inodepool.go @@ -0,0 +1,11 @@ +package dcron + +import "context" + +type INodePool interface { + Start(ctx context.Context) error + CheckJobAvailable(jobName string) bool + Stop(ctx context.Context) error + + GetNodeID() string +} diff --git a/inodepool_test.go b/inodepool_test.go new file mode 100644 index 0000000..c20f474 --- /dev/null +++ b/inodepool_test.go @@ -0,0 +1,75 @@ +package dcron_test + +import ( + "context" + "strconv" + "testing" + "time" + + "github.com/alicebob/miniredis/v2" + "github.com/go-redis/redis/v8" + "github.com/libi/dcron" + "github.com/libi/dcron/consistenthash" + "github.com/libi/dcron/driver" + "github.com/stretchr/testify/suite" +) + +type TestINodePoolSuite struct { + suite.Suite + + rds *miniredis.Miniredis + defaultHashReplicas int +} + +func (ts *TestINodePoolSuite) SetupTest() { + ts.rds = miniredis.RunT(ts.T()) + ts.defaultHashReplicas = 10 +} + +func (ts *TestINodePoolSuite) TearDownTest() { + ts.rds.Close() +} + +func (ts *TestINodePoolSuite) TestMultiNodes() { + var clients []*redis.Client + var drivers []driver.DriverV2 + var nodePools []dcron.INodePool + + NumberOfNodes := 5 + ServiceName := "TestMultiNodes" + updateDuration := 2 * time.Second + + for i := 0; i < NumberOfNodes; i++ { + clients = append(clients, redis.NewClient(&redis.Options{ + Addr: ts.rds.Addr(), + })) + drivers = append(drivers, driver.NewRedisDriver(clients[i])) + nodePools = append(nodePools, dcron.NewNodePool(ServiceName, drivers[i], updateDuration, ts.defaultHashReplicas, nil)) + } + + for i := 0; i < NumberOfNodes; i++ { + err := nodePools[i].Start(context.Background()) + if err != nil { + ts.T().Fail() + } + } + <-time.After(updateDuration * 2) + ring := consistenthash.New(ts.defaultHashReplicas, nil) + for _, v := range nodePools { + ring.Add(v.GetNodeID()) + } + + for i := 0; i < 10000; i++ { + for j := 0; j < NumberOfNodes; j++ { + ts.Require().Equal( + nodePools[j].CheckJobAvailable(strconv.Itoa(i)), + (ring.Get(strconv.Itoa(i)) == nodePools[j].GetNodeID()), + ) + } + } +} + +func TestTestINodePoolSuite(t *testing.T) { + s := new(TestINodePoolSuite) + suite.Run(t, s) +} diff --git a/node_pool.go b/nodepool.go similarity index 83% rename from node_pool.go rename to nodepool.go index 7ecb0e6..8c5c288 100644 --- a/node_pool.go +++ b/nodepool.go @@ -14,7 +14,7 @@ import ( // NodePool is a node pool type NodePool struct { serviceName string - NodeID string + nodeID string rwMut sync.RWMutex nodes *consistenthash.Map @@ -29,7 +29,7 @@ type NodePool struct { preNodes []string // sorted } -func NewNodePool(serviceName string, drv driver.DriverV2, updateDuration time.Duration, hashReplicas int, logger dlog.Logger) *NodePool { +func NewNodePool(serviceName string, drv driver.DriverV2, updateDuration time.Duration, hashReplicas int, logger dlog.Logger) INodePool { np := &NodePool{ serviceName: serviceName, driver: drv, @@ -49,14 +49,14 @@ func NewNodePool(serviceName string, drv driver.DriverV2, updateDuration time.Du return np } -func (np *NodePool) StartPool() (err error) { - err = np.driver.Start(context.Background()) +func (np *NodePool) Start(ctx context.Context) (err error) { + err = np.driver.Start(ctx) if err != nil { np.logger.Errorf("start pool error: %v", err) return } - np.NodeID = np.driver.NodeID() - nowNodes, err := np.driver.GetNodes(context.Background()) + np.nodeID = np.driver.NodeID() + nowNodes, err := np.driver.GetNodes(ctx) if err != nil { np.logger.Errorf("get nodes error: %v", err) return @@ -71,22 +71,27 @@ func (np *NodePool) CheckJobAvailable(jobName string) bool { np.rwMut.RLock() defer np.rwMut.RUnlock() if np.nodes == nil { - np.logger.Errorf("nodeID=%s, np.nodes is nil", np.NodeID) + np.logger.Errorf("nodeID=%s, np.nodes is nil", np.nodeID) } if np.nodes.IsEmpty() { return false } targetNode := np.nodes.Get(jobName) - if np.NodeID == targetNode { + if np.nodeID == targetNode { np.logger.Infof("job %s, running in node: %s", jobName, targetNode) } - return np.NodeID == targetNode + return np.nodeID == targetNode } -func (np *NodePool) Stop() { +func (np *NodePool) Stop(ctx context.Context) error { np.stopChan <- 1 - np.driver.Stop(context.Background()) + np.driver.Stop(ctx) np.preNodes = make([]string, 0) + return nil +} + +func (np *NodePool) GetNodeID() string { + return np.nodeID } func (np *NodePool) waitingForHashRing() { From d240cc54f9c941f3ce7b941302f7f609f132b071 Mon Sep 17 00:00:00 2001 From: libi <98360d9e4177568ec8ea51bd0444eeee4cdacafc> Date: Thu, 11 May 2023 14:29:52 +0800 Subject: [PATCH 22/27] update etcd driver ctx --- driver/etcddriver.go | 46 +++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/driver/etcddriver.go b/driver/etcddriver.go index 3dae65b..b489c8b 100644 --- a/driver/etcddriver.go +++ b/driver/etcddriver.go @@ -27,10 +27,11 @@ type EtcdDriver struct { leaseID clientv3.LeaseID logger dlog.Logger - stopChan chan int + ctx context.Context + cancel context.CancelFunc } -//NewEtcdDriver +// NewEtcdDriver func newEtcdDriver(cli *clientv3.Client) *EtcdDriver { ser := &EtcdDriver{ cli: cli, @@ -43,21 +44,21 @@ func newEtcdDriver(cli *clientv3.Client) *EtcdDriver { return ser } -//设置key value,绑定租约 -func (e *EtcdDriver) putKeyWithLease(key, val string) (clientv3.LeaseID, error) { +// 设置key value,绑定租约 +func (e *EtcdDriver) putKeyWithLease(ctx context.Context, key, val string) (clientv3.LeaseID, error) { //设置租约时间,最少5s if e.lease < etcdDefaultLease { e.lease = etcdDefaultLease } - ctx, cancel := context.WithTimeout(context.Background(), etcdBusinessTimeout) + subCtx, cancel := context.WithTimeout(ctx, etcdBusinessTimeout) defer cancel() - resp, err := e.cli.Grant(ctx, e.lease) + resp, err := e.cli.Grant(subCtx, e.lease) if err != nil { return 0, err } //注册服务并绑定租约 - _, err = e.cli.Put(ctx, key, val, clientv3.WithLease(resp.ID)) + _, err = e.cli.Put(subCtx, key, val, clientv3.WithLease(resp.ID)) if err != nil { return 0, err } @@ -65,11 +66,11 @@ func (e *EtcdDriver) putKeyWithLease(key, val string) (clientv3.LeaseID, error) return resp.ID, nil } -//WatchService 初始化服务列表和监视 -func (e *EtcdDriver) watchService(serviceName string) error { +// WatchService 初始化服务列表和监视 +func (e *EtcdDriver) watchService(ctx context.Context, serviceName string) error { prefix := GetKeyPre(serviceName) // 根据前缀获取现有的key - resp, err := e.cli.Get(context.Background(), prefix, clientv3.WithPrefix()) + resp, err := e.cli.Get(ctx, prefix, clientv3.WithPrefix()) if err != nil { return err } @@ -121,7 +122,7 @@ func (e *EtcdDriver) getServices() []string { func (e *EtcdDriver) keepAlive(ctx context.Context, nodeID string) (<-chan *clientv3.LeaseKeepAliveResponse, error) { var err error - e.leaseID, err = e.putKeyWithLease(nodeID, nodeID) + e.leaseID, err = e.putKeyWithLease(ctx, nodeID, nodeID) if err != nil { e.logger.Errorf("putKeyWithLease error: %v", err) return nil, err @@ -130,25 +131,24 @@ func (e *EtcdDriver) keepAlive(ctx context.Context, nodeID string) (<-chan *clie return e.cli.KeepAlive(ctx, e.leaseID) } -func (e *EtcdDriver) revoke() { - _, err := e.cli.Lease.Revoke(context.Background(), e.leaseID) +func (e *EtcdDriver) revoke(ctx context.Context) { + _, err := e.cli.Lease.Revoke(ctx, e.leaseID) if err != nil { e.logger.Printf("lease revoke error: %v", err) } } -func (e *EtcdDriver) heartBeat() { +func (e *EtcdDriver) heartBeat(ctx context.Context) { label: - leaseCh, err := e.keepAlive(context.Background(), e.nodeID) + leaseCh, err := e.keepAlive(ctx, e.nodeID) if err != nil { return } for { select { - case <-e.stopChan: + case <-e.ctx.Done(): { - e.revoke() - e.logger.Errorf("driver stopped") + e.logger.Infof("driver stopped") return } case _, ok := <-leaseCh: @@ -188,9 +188,10 @@ func (e *EtcdDriver) GetNodes(ctx context.Context) (nodes []string, err error) { } func (e *EtcdDriver) Start(ctx context.Context) (err error) { - e.stopChan = make(chan int, 1) - go e.heartBeat() - err = e.watchService(e.serviceName) + // renew a global ctx when start every time + e.ctx, e.cancel = context.WithCancel(context.TODO()) + go e.heartBeat(ctx) + err = e.watchService(ctx, e.serviceName) if err != nil { return } @@ -198,7 +199,8 @@ func (e *EtcdDriver) Start(ctx context.Context) (err error) { } func (e *EtcdDriver) Stop(ctx context.Context) (err error) { - close(e.stopChan) + e.revoke(ctx) + e.cancel() return } From 2dd1bdfe9aa055cfbd1a8ecc5a8cbc3ceb812e0f Mon Sep 17 00:00:00 2001 From: dxyinme Date: Fri, 12 May 2023 21:08:24 +0800 Subject: [PATCH 23/27] update etcd and redis nodepool test case --- inodepool_test.go | 97 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 78 insertions(+), 19 deletions(-) diff --git a/inodepool_test.go b/inodepool_test.go index c20f474..76d4988 100644 --- a/inodepool_test.go +++ b/inodepool_test.go @@ -12,61 +12,120 @@ import ( "github.com/libi/dcron/consistenthash" "github.com/libi/dcron/driver" "github.com/stretchr/testify/suite" + clientv3 "go.etcd.io/etcd/client/v3" + "go.etcd.io/etcd/tests/v3/integration" ) type TestINodePoolSuite struct { suite.Suite rds *miniredis.Miniredis + etcdsvr integration.LazyCluster defaultHashReplicas int } func (ts *TestINodePoolSuite) SetupTest() { - ts.rds = miniredis.RunT(ts.T()) ts.defaultHashReplicas = 10 } func (ts *TestINodePoolSuite) TearDownTest() { - ts.rds.Close() + if ts.rds != nil { + ts.rds.Close() + ts.rds = nil + } + if ts.etcdsvr != nil { + ts.etcdsvr.Terminate() + ts.etcdsvr = nil + } } -func (ts *TestINodePoolSuite) TestMultiNodes() { - var clients []*redis.Client - var drivers []driver.DriverV2 - var nodePools []dcron.INodePool +func (ts *TestINodePoolSuite) setUpRedis() { + ts.rds = miniredis.RunT(ts.T()) +} - NumberOfNodes := 5 - ServiceName := "TestMultiNodes" - updateDuration := 2 * time.Second +func (ts *TestINodePoolSuite) setUpEtcd() { + ts.etcdsvr = integration.NewLazyCluster() +} - for i := 0; i < NumberOfNodes; i++ { - clients = append(clients, redis.NewClient(&redis.Options{ +func (ts *TestINodePoolSuite) declareRedisDrivers(clients *[]*redis.Client, drivers *[]driver.DriverV2, numberOfNodes int) { + for i := 0; i < numberOfNodes; i++ { + *clients = append(*clients, redis.NewClient(&redis.Options{ Addr: ts.rds.Addr(), })) - drivers = append(drivers, driver.NewRedisDriver(clients[i])) - nodePools = append(nodePools, dcron.NewNodePool(ServiceName, drivers[i], updateDuration, ts.defaultHashReplicas, nil)) + *drivers = append(*drivers, driver.NewRedisDriver((*clients)[i])) } +} - for i := 0; i < NumberOfNodes; i++ { - err := nodePools[i].Start(context.Background()) +func (ts *TestINodePoolSuite) declareEtcdDrivers(clients *[]*clientv3.Client, drivers *[]driver.DriverV2, numberOfNodes int) { + for i := 0; i < numberOfNodes; i++ { + cli, err := clientv3.New(clientv3.Config{ + Endpoints: ts.etcdsvr.EndpointsV3(), + }) + if err != nil { + ts.T().Fatal(err) + } + *clients = append(*clients, cli) + *drivers = append(*drivers, driver.NewEtcdDriver((*clients)[i])) + } +} + +func (ts *TestINodePoolSuite) runCheckJobAvailable(numberOfNodes int, ServiceName string, nodePools *[]dcron.INodePool, updateDuration time.Duration) { + for i := 0; i < numberOfNodes; i++ { + err := (*nodePools)[i].Start(context.Background()) if err != nil { ts.T().Fail() } } <-time.After(updateDuration * 2) ring := consistenthash.New(ts.defaultHashReplicas, nil) - for _, v := range nodePools { + for _, v := range *nodePools { ring.Add(v.GetNodeID()) } for i := 0; i < 10000; i++ { - for j := 0; j < NumberOfNodes; j++ { + for j := 0; j < numberOfNodes; j++ { ts.Require().Equal( - nodePools[j].CheckJobAvailable(strconv.Itoa(i)), - (ring.Get(strconv.Itoa(i)) == nodePools[j].GetNodeID()), + (*nodePools)[j].CheckJobAvailable(strconv.Itoa(i)), + (ring.Get(strconv.Itoa(i)) == (*nodePools)[j].GetNodeID()), ) } } + +} + +func (ts *TestINodePoolSuite) TestMultiNodesRedis() { + var clients []*redis.Client + var drivers []driver.DriverV2 + var nodePools []dcron.INodePool + + numberOfNodes := 5 + ServiceName := "TestMultiNodesRedis" + updateDuration := 2 * time.Second + ts.setUpRedis() + ts.declareRedisDrivers(&clients, &drivers, numberOfNodes) + + for i := 0; i < numberOfNodes; i++ { + nodePools = append(nodePools, dcron.NewNodePool(ServiceName, drivers[i], updateDuration, ts.defaultHashReplicas, nil)) + } + ts.runCheckJobAvailable(numberOfNodes, ServiceName, &nodePools, updateDuration) +} + +func (ts *TestINodePoolSuite) TestMultiNodesEtcd() { + var clients []*clientv3.Client + var drivers []driver.DriverV2 + var nodePools []dcron.INodePool + + numberOfNodes := 5 + ServiceName := "TestMultiNodesEtcd" + updateDuration := 8 * time.Second + + ts.setUpEtcd() + ts.declareEtcdDrivers(&clients, &drivers, numberOfNodes) + + for i := 0; i < numberOfNodes; i++ { + nodePools = append(nodePools, dcron.NewNodePool(ServiceName, drivers[i], updateDuration, ts.defaultHashReplicas, nil)) + } + ts.runCheckJobAvailable(numberOfNodes, ServiceName, &nodePools, updateDuration) } func TestTestINodePoolSuite(t *testing.T) { From a105aa5b1a06ce62c869f5625a58bd3327a58863 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Sat, 13 May 2023 10:48:16 +0800 Subject: [PATCH 24/27] update --- driver/redisdriver.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/driver/redisdriver.go b/driver/redisdriver.go index efe68ed..6ad371b 100644 --- a/driver/redisdriver.go +++ b/driver/redisdriver.go @@ -23,7 +23,11 @@ type RedisDriver struct { timeout time.Duration logger dlog.Logger started bool - stopChan chan interface{} + + // this context is used to define + // the life time of this driver. + runtimeCtx context.Context + runtimeCancel context.CancelFunc sync.Mutex } @@ -60,7 +64,7 @@ func (rd *RedisDriver) Start(ctx context.Context) (err error) { err = errors.New("this driver is started") return } - rd.stopChan = make(chan interface{}, 1) + rd.runtimeCtx, rd.runtimeCancel = context.WithCancel(context.TODO()) rd.started = true // register err = rd.registerServiceNode() @@ -76,7 +80,7 @@ func (rd *RedisDriver) Start(ctx context.Context) (err error) { func (rd *RedisDriver) Stop(ctx context.Context) (err error) { rd.Lock() defer rd.Unlock() - close(rd.stopChan) + rd.runtimeCancel() rd.started = false return } @@ -98,7 +102,7 @@ func (rd *RedisDriver) heartBeat() { rd.logger.Errorf("register service node error %+v", err) } } - case <-rd.stopChan: + case <-rd.runtimeCtx.Done(): { if err := rd.c.Del(context.Background(), rd.nodeID, rd.nodeID).Err(); err != nil { rd.logger.Errorf("unregister service node error %+v", err) From a3c1e21c06eaf1aeb7f1a1f57b840100c38cee14 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Wed, 17 May 2023 20:07:46 +0800 Subject: [PATCH 25/27] update redis zset driver --- driver/driver.go | 4 + driver/rediszsetdriver.go | 140 +++++++++++++++++++++++++++++++++ driver/rediszsetdriver_test.go | 92 ++++++++++++++++++++++ driver/util.go | 10 ++- 4 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 driver/rediszsetdriver.go create mode 100644 driver/rediszsetdriver_test.go diff --git a/driver/driver.go b/driver/driver.go index 88e88ec..a01c1aa 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -31,3 +31,7 @@ func NewRedisDriver(redisClient *redis.Client) DriverV2 { func NewEtcdDriver(etcdCli *clientv3.Client) DriverV2 { return newEtcdDriver(etcdCli) } + +func NewRedisZSetDriver(redisClient *redis.Client) DriverV2 { + return newRedisZSetDriver(redisClient) +} diff --git a/driver/rediszsetdriver.go b/driver/rediszsetdriver.go new file mode 100644 index 0000000..968e695 --- /dev/null +++ b/driver/rediszsetdriver.go @@ -0,0 +1,140 @@ +package driver + +import ( + "context" + "errors" + "fmt" + "log" + "sync" + "time" + + "github.com/go-redis/redis/v8" + "github.com/libi/dcron/dlog" +) + +type RedisZSetDriver struct { + c *redis.Client + serviceName string + nodeID string + timeout time.Duration + logger dlog.Logger + started bool + + // this context is used to define + // the life time of this driver. + runtimeCtx context.Context + runtimeCancel context.CancelFunc + + sync.Mutex +} + +func newRedisZSetDriver(redisClient *redis.Client) *RedisZSetDriver { + rd := &RedisZSetDriver{ + c: redisClient, + logger: &dlog.StdLogger{ + Log: log.Default(), + }, + timeout: redisDefaultTimeout, + } + rd.started = false + return rd +} + +func (rd *RedisZSetDriver) Init(serviceName string, opts ...Option) { + rd.serviceName = serviceName + rd.nodeID = GetNodeId(serviceName) + for _, opt := range opts { + rd.withOption(opt) + } +} + +func (rd *RedisZSetDriver) NodeID() string { + return rd.nodeID +} + +func (rd *RedisZSetDriver) GetNodes(ctx context.Context) (nodes []string, err error) { + rd.Lock() + defer rd.Unlock() + sliceCmd := rd.c.ZRangeByScore(ctx, GetKeyPre(rd.serviceName), &redis.ZRangeBy{ + Min: fmt.Sprintf("%d", TimePre(time.Now(), rd.timeout)), + Max: "+inf", + }) + if err = sliceCmd.Err(); err != nil { + return nil, err + } else { + nodes = make([]string, len(sliceCmd.Val())) + copy(nodes, sliceCmd.Val()) + } + rd.logger.Infof("nodes=%v", nodes) + return +} +func (rd *RedisZSetDriver) Start(ctx context.Context) (err error) { + rd.Lock() + defer rd.Unlock() + if rd.started { + err = errors.New("this driver is started") + return + } + rd.runtimeCtx, rd.runtimeCancel = context.WithCancel(context.TODO()) + rd.started = true + // register + err = rd.registerServiceNode() + if err != nil { + rd.logger.Errorf("register service error=%v", err) + return + } + // heartbeat timer + go rd.heartBeat() + return +} +func (rd *RedisZSetDriver) Stop(ctx context.Context) (err error) { + rd.Lock() + defer rd.Unlock() + rd.runtimeCancel() + rd.started = false + return +} + +func (rd *RedisZSetDriver) withOption(opt Option) (err error) { + switch opt.Type() { + case OptionTypeTimeout: + { + rd.timeout = opt.(TimeoutOption).timeout + } + case OptionTypeLogger: + { + rd.logger = opt.(LoggerOption).logger + } + } + return +} + +// private function + +func (rd *RedisZSetDriver) heartBeat() { + tick := time.NewTicker(rd.timeout / 2) + for { + select { + case <-tick.C: + { + if err := rd.registerServiceNode(); err != nil { + rd.logger.Errorf("register service node error %+v", err) + } + } + case <-rd.runtimeCtx.Done(): + { + if err := rd.c.Del(context.Background(), rd.nodeID, rd.nodeID).Err(); err != nil { + rd.logger.Errorf("unregister service node error %+v", err) + } + return + } + } + } +} + +func (rd *RedisZSetDriver) registerServiceNode() error { + return rd.c.ZAdd(context.Background(), GetKeyPre(rd.serviceName), &redis.Z{ + Score: float64(time.Now().Unix()), + Member: rd.nodeID, + }).Err() +} diff --git a/driver/rediszsetdriver_test.go b/driver/rediszsetdriver_test.go new file mode 100644 index 0000000..ee33865 --- /dev/null +++ b/driver/rediszsetdriver_test.go @@ -0,0 +1,92 @@ +package driver_test + +import ( + "context" + "log" + "testing" + "time" + + "github.com/alicebob/miniredis/v2" + "github.com/go-redis/redis/v8" + "github.com/libi/dcron/dlog" + "github.com/libi/dcron/driver" + "github.com/stretchr/testify/require" +) + +func testFuncNewRedisZSetDriver(addr string) driver.DriverV2 { + log.Println("redis=", addr) + redisCli := redis.NewClient(&redis.Options{ + Addr: addr, + }) + return driver.NewRedisZSetDriver(redisCli) +} + +func TestRedisZSetDriver_GetNodes(t *testing.T) { + rds := miniredis.RunT(t) + drvs := make([]driver.DriverV2, 0) + N := 10 + for i := 0; i < N; i++ { + drv := testFuncNewRedisZSetDriver(rds.Addr()) + drv.Init( + t.Name(), + driver.NewTimeoutOption(5*time.Second), + driver.NewLoggerOption(dlog.NewLoggerForTest(t))) + err := drv.Start(context.Background()) + require.Nil(t, err) + drvs = append(drvs, drv) + } + + for _, v := range drvs { + nodes, err := v.GetNodes(context.Background()) + require.Nil(t, err) + require.Equal(t, N, len(nodes)) + } + + for _, v := range drvs { + v.Stop(context.Background()) + } +} + +func TestRedisZSetDriver_Stop(t *testing.T) { + var err error + var nodes []string + rds := miniredis.RunT(t) + drv1 := testFuncNewRedisZSetDriver(rds.Addr()) + drv1.Init(t.Name(), + driver.NewTimeoutOption(5*time.Second), + driver.NewLoggerOption(dlog.NewLoggerForTest(t))) + + drv2 := testFuncNewRedisZSetDriver(rds.Addr()) + drv2.Init(t.Name(), + driver.NewTimeoutOption(5*time.Second), + driver.NewLoggerOption(dlog.NewLoggerForTest(t))) + err = drv2.Start(context.Background()) + require.Nil(t, err) + + err = drv1.Start(context.Background()) + require.Nil(t, err) + + nodes, err = drv1.GetNodes(context.Background()) + require.Nil(t, err) + require.Len(t, nodes, 2) + + nodes, err = drv2.GetNodes(context.Background()) + require.Nil(t, err) + require.Len(t, nodes, 2) + + drv1.Stop(context.Background()) + + <-time.After(6 * time.Second) + nodes, err = drv2.GetNodes(context.Background()) + require.Nil(t, err) + require.Len(t, nodes, 1) + + err = drv1.Start(context.Background()) + require.Nil(t, err) + <-time.After(5 * time.Second) + nodes, err = drv2.GetNodes(context.Background()) + require.Nil(t, err) + require.Len(t, nodes, 2) + + drv2.Stop(context.Background()) +} diff --git a/driver/util.go b/driver/util.go index f3dfc10..cd020bd 100644 --- a/driver/util.go +++ b/driver/util.go @@ -1,6 +1,10 @@ package driver -import "github.com/google/uuid" +import ( + "time" + + "github.com/google/uuid" +) // GlobalKeyPrefix is global redis key preifx const GlobalKeyPrefix = "distributed-cron:" @@ -20,3 +24,7 @@ func GetStableJobStore(serviceName string) string { func GetStableJobStoreTxKey(serviceName string) string { return GetKeyPre(serviceName) + "TX:stable-jobs" } + +func TimePre(t time.Time, preDuration time.Duration) int64 { + return t.Unix() - int64(preDuration.Seconds()) +} From dc6baf4fa85b75ce1d086fc34db786ad5c634789 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Wed, 17 May 2023 22:47:07 +0800 Subject: [PATCH 26/27] update --- inodepool_test.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/inodepool_test.go b/inodepool_test.go index 76d4988..b84874d 100644 --- a/inodepool_test.go +++ b/inodepool_test.go @@ -69,6 +69,15 @@ func (ts *TestINodePoolSuite) declareEtcdDrivers(clients *[]*clientv3.Client, dr } } +func (ts *TestINodePoolSuite) declareRedisZSetDrivers(clients *[]*redis.Client, drivers *[]driver.DriverV2, numberOfNodes int) { + for i := 0; i < numberOfNodes; i++ { + *clients = append(*clients, redis.NewClient(&redis.Options{ + Addr: ts.rds.Addr(), + })) + *drivers = append(*drivers, driver.NewRedisZSetDriver((*clients)[i])) + } +} + func (ts *TestINodePoolSuite) runCheckJobAvailable(numberOfNodes int, ServiceName string, nodePools *[]dcron.INodePool, updateDuration time.Duration) { for i := 0; i < numberOfNodes; i++ { err := (*nodePools)[i].Start(context.Background()) @@ -128,6 +137,24 @@ func (ts *TestINodePoolSuite) TestMultiNodesEtcd() { ts.runCheckJobAvailable(numberOfNodes, ServiceName, &nodePools, updateDuration) } +func (ts *TestINodePoolSuite) TestMultiNodesRedisZSet() { + var clients []*redis.Client + var drivers []driver.DriverV2 + var nodePools []dcron.INodePool + + numberOfNodes := 5 + ServiceName := "TestMultiNodesEtcd" + updateDuration := 2 * time.Second + + ts.setUpRedis() + ts.declareRedisZSetDrivers(&clients, &drivers, numberOfNodes) + + for i := 0; i < numberOfNodes; i++ { + nodePools = append(nodePools, dcron.NewNodePool(ServiceName, drivers[i], updateDuration, ts.defaultHashReplicas, nil)) + } + ts.runCheckJobAvailable(numberOfNodes, ServiceName, &nodePools, updateDuration) +} + func TestTestINodePoolSuite(t *testing.T) { s := new(TestINodePoolSuite) suite.Run(t, s) From b4e477fba06cdd94618c33ce04ebe38295715ca9 Mon Sep 17 00:00:00 2001 From: dxyinme Date: Wed, 24 May 2023 19:25:06 +0800 Subject: [PATCH 27/27] update --- driver/rediszsetdriver_test.go | 2 -- driver/util.go | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/driver/rediszsetdriver_test.go b/driver/rediszsetdriver_test.go index ee33865..12c8079 100644 --- a/driver/rediszsetdriver_test.go +++ b/driver/rediszsetdriver_test.go @@ -2,7 +2,6 @@ package driver_test import ( "context" - "log" "testing" "time" @@ -14,7 +13,6 @@ import ( ) func testFuncNewRedisZSetDriver(addr string) driver.DriverV2 { - log.Println("redis=", addr) redisCli := redis.NewClient(&redis.Options{ Addr: addr, }) diff --git a/driver/util.go b/driver/util.go index cd020bd..dfe20e9 100644 --- a/driver/util.go +++ b/driver/util.go @@ -26,5 +26,5 @@ func GetStableJobStoreTxKey(serviceName string) string { } func TimePre(t time.Time, preDuration time.Duration) int64 { - return t.Unix() - int64(preDuration.Seconds()) + return t.Add(-preDuration).Unix() }