首页 技术 正文
技术 2022年11月13日
0 收藏 814 点赞 3,851 浏览 2426 个字
package clientv3

import (
    pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
    "golang.org/x/net/context"
    "google.golang.org/grpc"
)

type (
    Member               pb.Member
    MemberListResponse   pb.MemberListResponse
    MemberAddResponse    pb.MemberAddResponse
    MemberRemoveResponse pb.MemberRemoveResponse
    MemberUpdateResponse pb.MemberUpdateResponse
)

type Cluster interface {
    // MemberList lists the current cluster membership.
    MemberList(ctx context.Context) (*MemberListResponse, error)

    // MemberAdd adds a new member into the cluster.
    MemberAdd(ctx context.Context, peerAddrs []string) (*MemberAddResponse, error)

    // MemberRemove removes an existing member from the cluster.
    MemberRemove(ctx context.Context, id uint64) (*MemberRemoveResponse, error)

    // MemberUpdate updates the peer addresses of the member.
    MemberUpdate(ctx context.Context, id uint64, peerAddrs []string) (*MemberUpdateResponse, error)
}

type cluster struct {
    remote pb.ClusterClient
}

func NewCluster(c *Client) Cluster {
    return &cluster{remote: RetryClusterClient(c)}
}

func (c *cluster) MemberAdd(ctx context.Context, peerAddrs []string) (*MemberAddResponse, error) {
    r := &pb.MemberAddRequest{PeerURLs: peerAddrs}
    resp, err := c.remote.MemberAdd(ctx, r)
    if err == nil {
        return (*MemberAddResponse)(resp), nil
    }
    if isHaltErr(ctx, err) {
        return nil, toErr(ctx, err)
    }
    return nil, toErr(ctx, err)
}

func (c *cluster) MemberRemove(ctx context.Context, id uint64) (*MemberRemoveResponse, error) {
    r := &pb.MemberRemoveRequest{ID: id}
    resp, err := c.remote.MemberRemove(ctx, r)
    if err == nil {
        return (*MemberRemoveResponse)(resp), nil
    }
    if isHaltErr(ctx, err) {
        return nil, toErr(ctx, err)
    }
    return nil, toErr(ctx, err)
}

func (c *cluster) MemberUpdate(ctx context.Context, id uint64, peerAddrs []string) (*MemberUpdateResponse, error) {
    // it is safe to retry on update.
    for {
        r := &pb.MemberUpdateRequest{ID: id, PeerURLs: peerAddrs}
        resp, err := c.remote.MemberUpdate(ctx, r, grpc.FailFast(false))
        if err == nil {
            return (*MemberUpdateResponse)(resp), nil
        }
        if isHaltErr(ctx, err) {
            return nil, toErr(ctx, err)
        }
    }
}

func (c *cluster) MemberList(ctx context.Context) (*MemberListResponse, error) {
    // it is safe to retry on list.
    for {
        resp, err := c.remote.MemberList(ctx, &pb.MemberListRequest{}, grpc.FailFast(false))
        if err == nil {
            return (*MemberListResponse)(resp), nil
        }
        if isHaltErr(ctx, err) {
            return nil, toErr(ctx, err)
        }
    }
}

下一篇: op.go
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,942
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,468
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,281
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,096
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,728
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,765