码迷,mamicode.com
首页 > 其他好文 > 详细

cluster.go

时间:2017-08-30 14:09:27      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:[]   erro   over   res   into   new   move   mem   fas   

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

cluster.go

标签:[]   erro   over   res   into   new   move   mem   fas   

原文地址:http://www.cnblogs.com/zhangboyu/p/7452662.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!