• cluster.go


    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)
            }
        }
    }

  • 相关阅读:
    Some notes in Stanford CS106A(4)
    Some notes in Stanford CS106A(3)
    Some notes in Stanford CS106A(2)
    Some notes in Stanford CS106A(1)
    将前台页面的数据传到后台的方法(不调用ajax,少量数据)
    12、(扩展)获取省份表,填充于下拉列表框的简易js
    iframe刷新问题
    MVC基础
    DataList
    序列化
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/7452662.html
Copyright © 2020-2023  润新知