cubefs

Форк
0
136 строк · 3.3 Кб
1
// Copyright 2022 The CubeFS Authors.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
12
// implied. See the License for the specific language governing
13
// permissions and limitations under the License.
14

15
package clustermgr
16

17
import (
18
	"context"
19
	"encoding/json"
20
	"net/http"
21

22
	"github.com/cubefs/cubefs/blobstore/common/errors"
23
	"github.com/cubefs/cubefs/blobstore/common/proto"
24
	"github.com/cubefs/cubefs/blobstore/common/rpc"
25
)
26

27
const (
28
	MemberTypeMin = MemberType(iota)
29
	MemberTypeLearner
30
	MemberTypeNormal
31
	MemberTypeMax
32
)
33

34
var retryCodes = []int{
35
	http.StatusInternalServerError,
36
	http.StatusBadGateway,
37
	http.StatusGatewayTimeout,
38
	int(errors.ErrRaftReadIndex),
39
}
40

41
type MemberType uint8
42

43
type Config struct {
44
	rpc.LbConfig
45
}
46

47
type Client struct {
48
	rpc.Client
49
}
50

51
var _ ClientAPI = (*Client)(nil)
52

53
var defaultShouldRetry = func(code int, err error) bool {
54
	for i := range retryCodes {
55
		if code == retryCodes[i] {
56
			return true
57
		}
58
	}
59

60
	return err != nil
61
}
62

63
func New(cfg *Config) *Client {
64
	if cfg.ShouldRetry == nil {
65
		cfg.ShouldRetry = defaultShouldRetry
66
	}
67
	return &Client{rpc.NewLbClient(&cfg.LbConfig, nil)}
68
}
69

70
type BidScopeArgs struct {
71
	Count uint64 `json:"count"`
72
}
73

74
type BidScopeRet struct {
75
	StartBid proto.BlobID `json:"start_bid"`
76
	EndBid   proto.BlobID `json:"end_bid"`
77
}
78

79
// BidAlloc return available bid scope
80
func (c *Client) AllocBid(ctx context.Context, args *BidScopeArgs) (ret *BidScopeRet, err error) {
81
	ret = &BidScopeRet{}
82
	err = c.PostWith(ctx, "/bid/alloc", ret, args)
83
	return
84
}
85

86
type AddMemberArgs struct {
87
	PeerID     uint64     `json:"peer_id"`
88
	Host       string     `json:"host"`
89
	MemberType MemberType `json:"member_type"`
90
	NodeHost   string     `json:"node_host"`
91
}
92

93
type MemberContext struct {
94
	NodeHost string `json:"node_host"`
95
}
96

97
func (mc *MemberContext) Marshal() ([]byte, error) {
98
	return json.Marshal(mc)
99
}
100

101
func (mc *MemberContext) Unmarshal(data []byte) error {
102
	return json.Unmarshal(data, mc)
103
}
104

105
type RemoveMemberArgs struct {
106
	PeerID uint64 `json:"peer_id"`
107
}
108

109
// AddMember add new member(normal or learner) into raft cluster
110
func (c *Client) AddMember(ctx context.Context, args *AddMemberArgs) (err error) {
111
	err = c.PostWith(ctx, "/member/add", nil, args)
112
	return
113
}
114

115
// RemoveMember remove member from raft cluster
116
func (c *Client) RemoveMember(ctx context.Context, peerID uint64) (err error) {
117
	err = c.PostWith(ctx, "/member/remove", nil, &RemoveMemberArgs{PeerID: peerID})
118
	return
119
}
120

121
// RemoveMember remove member from raft cluster
122
func (c *Client) TransferLeadership(ctx context.Context, transfereeID uint64) (err error) {
123
	err = c.PostWith(ctx, "/leadership/transfer", nil, &RemoveMemberArgs{PeerID: transfereeID})
124
	return
125
}
126

127
// Stat return cluster's statics info, like space info and raft status and so on
128
func (c *Client) Stat(ctx context.Context) (ret *StatInfo, err error) {
129
	ret = &StatInfo{}
130
	err = c.GetWith(ctx, "/stat", ret)
131
	return
132
}
133

134
func (c *Client) Snapshot(ctx context.Context) (*http.Response, error) {
135
	return c.Get(ctx, "/snapshot/dump")
136
}
137

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.