1// Copyright 2021 The etcd 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 implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package buckets
16
17import (
18	"bytes"
19
20	"go.etcd.io/etcd/server/v3/mvcc/backend"
21)
22
23var (
24	keyBucketName   = []byte("key")
25	metaBucketName  = []byte("meta")
26	leaseBucketName = []byte("lease")
27	alarmBucketName = []byte("alarm")
28
29	clusterBucketName = []byte("cluster")
30
31	membersBucketName        = []byte("members")
32	membersRemovedBucketName = []byte("members_removed")
33
34	authBucketName      = []byte("auth")
35	authUsersBucketName = []byte("authUsers")
36	authRolesBucketName = []byte("authRoles")
37
38	testBucketName = []byte("test")
39)
40
41var (
42	Key     = backend.Bucket(bucket{id: 1, name: keyBucketName, safeRangeBucket: true})
43	Meta    = backend.Bucket(bucket{id: 2, name: metaBucketName, safeRangeBucket: false})
44	Lease   = backend.Bucket(bucket{id: 3, name: leaseBucketName, safeRangeBucket: false})
45	Alarm   = backend.Bucket(bucket{id: 4, name: alarmBucketName, safeRangeBucket: false})
46	Cluster = backend.Bucket(bucket{id: 5, name: clusterBucketName, safeRangeBucket: false})
47
48	Members        = backend.Bucket(bucket{id: 10, name: membersBucketName, safeRangeBucket: false})
49	MembersRemoved = backend.Bucket(bucket{id: 11, name: membersRemovedBucketName, safeRangeBucket: false})
50
51	Auth      = backend.Bucket(bucket{id: 20, name: authBucketName, safeRangeBucket: false})
52	AuthUsers = backend.Bucket(bucket{id: 21, name: authUsersBucketName, safeRangeBucket: false})
53	AuthRoles = backend.Bucket(bucket{id: 22, name: authRolesBucketName, safeRangeBucket: false})
54
55	Test = backend.Bucket(bucket{id: 100, name: testBucketName, safeRangeBucket: false})
56)
57
58type bucket struct {
59	id              backend.BucketID
60	name            []byte
61	safeRangeBucket bool
62}
63
64func (b bucket) ID() backend.BucketID    { return b.id }
65func (b bucket) Name() []byte            { return b.name }
66func (b bucket) String() string          { return string(b.Name()) }
67func (b bucket) IsSafeRangeBucket() bool { return b.safeRangeBucket }
68
69var (
70	MetaConsistentIndexKeyName = []byte("consistent_index")
71	MetaTermKeyName            = []byte("term")
72)
73
74// DefaultIgnores defines buckets & keys to ignore in hash checking.
75func DefaultIgnores(bucket, key []byte) bool {
76	// consistent index & term might be changed due to v2 internal sync, which
77	// is not controllable by the user.
78	return bytes.Compare(bucket, Meta.Name()) == 0 &&
79		(bytes.Compare(key, MetaTermKeyName) == 0 || bytes.Compare(key, MetaConsistentIndexKeyName) == 0)
80}
81