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

  • 相关阅读:
    南阳理工ACM1076--方案数量
    南阳理工oj88--汉诺塔(一)
    杭电ACM1170--Balloon Comes!
    杭电ACM2011-- 多项式求和
    杭电ACM2080--夹角有多大II
    杭电ACM2076--夹角有多大(题目已修改,注意读题)
    请!继续!
    南阳理工ACM954--N!
    南阳理工ACM975--关于521
    致自己即将到来的人生
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/7452662.html
Copyright © 2020-2023  润新知