1
// Copyright 2022 The CubeFS Authors.
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
7
// http://www.apache.org/licenses/LICENSE-2.0
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.
23
"github.com/stretchr/testify/require"
25
"github.com/cubefs/cubefs/blobstore/api/access"
26
"github.com/cubefs/cubefs/blobstore/common/codemode"
27
"github.com/cubefs/cubefs/blobstore/common/proto"
28
"github.com/cubefs/cubefs/blobstore/util/bytespool"
32
testMaxBlob = access.SliceInfo{
33
MinBid: proto.BlobID(math.MaxUint64),
34
Vid: proto.Vid(math.MaxInt32),
35
Count: math.MaxUint32,
37
testMaxLoc = access.Location{
38
ClusterID: proto.ClusterID(math.MaxUint32),
39
CodeMode: codemode.CodeMode(math.MaxInt8),
41
BlobSize: math.MaxUint32,
45
testMinBlob = access.SliceInfo{}
46
testMinLoc = access.Location{}
49
func TestAccessServiceLocationCrc(t *testing.T) {
51
_, err := calcCrc(nil)
55
crc, err := calcCrc(&testMinLoc)
56
require.NoError(t, err)
57
require.Equal(t, uint32(0x8a7370cc), crc)
60
crc, err := calcCrc(&testMaxLoc)
61
require.NoError(t, err)
62
require.Equal(t, uint32(0xda55150a), crc)
65
loc := testMinLoc.Copy()
69
require.NoError(t, err)
70
require.Equal(t, uint32(0x9e17bc9e), loc.Crc)
73
loc := testMinLoc.Copy()
75
require.False(t, verifyCrc(&loc))
78
require.True(t, verifyCrc(&loc))
82
func TestAccessServiceLocationSecret(t *testing.T) {
83
secret := make([]byte, len(_crcMagicKey))
84
copy(secret, _crcMagicKey[:])
86
copy(_crcMagicKey[:], secret)
89
initLocationSecret([]byte{0x34, 0x45, 0x18, 0x4f})
90
crc, err := calcCrc(&testMinLoc)
91
require.NoError(t, err)
92
require.NotEqual(t, uint32(0x8a7370cc), crc)
93
require.Equal(t, uint32(0xdbe8df90), crc)
97
initLocationSecret([]byte{0x1, 0x2, 0x3, 0x4})
98
crc, err := calcCrc(&testMinLoc)
99
require.NoError(t, err)
100
require.Equal(t, uint32(0xdbe8df90), crc)
104
func TestAccessServiceLocationSignCrc(t *testing.T) {
105
loc := &access.Location{
111
Blobs: []access.SliceInfo{{
118
require.True(t, verifyCrc(loc))
121
loc1, loc2 := loc.Copy(), loc.Copy()
122
require.NoError(t, signCrc(loc, []access.Location{loc1, loc2}))
125
loc1, loc2 := loc.Copy(), loc.Copy()
128
require.Error(t, signCrc(loc, []access.Location{loc1, loc2}))
131
loc1, loc2 := loc.Copy(), loc.Copy()
133
require.Error(t, signCrc(loc, []access.Location{loc1, loc2}))
136
loc1, loc2 := loc.Copy(), loc.Copy()
139
require.Error(t, signCrc(loc, []access.Location{loc1, loc2}))
142
loc1, loc2 := loc.Copy(), loc.Copy()
145
require.Error(t, signCrc(loc, []access.Location{loc1, loc2}))
148
loc1, loc2 := loc.Copy(), loc.Copy()
150
loc2.Blobs[0].Count = 5
153
require.Error(t, signCrc(loc, []access.Location{loc1, loc2}))
157
func calcCrcWithoutMagic(loc *access.Location) (uint32, error) {
158
crcWriter := crc32.New(_crcTable)
160
buf := bytespool.Alloc(1024)
161
defer bytespool.Free(buf)
163
n := loc.Encode2(buf)
164
crcWriter.Write(buf[4:n])
166
return crcWriter.Sum32(), nil
169
func benchmarkCrc(b *testing.B, key string,
170
location access.Location, blob access.SliceInfo,
171
run func(loc *access.Location) (uint32, error)) {
172
cases := []int{0, 2, 4, 8, 16, 32}
173
for _, l := range cases {
175
b.Run(fmt.Sprintf(key+"-%d", l), func(b *testing.B) {
176
loc := location.Copy()
177
loc.Blobs = make([]access.SliceInfo, l)
178
for idx := range loc.Blobs {
179
loc.Blobs[idx] = blob
182
for ii := 0; ii <= b.N; ii++ {
189
func BenchmarkAccessServerCrcWithMagicMin(b *testing.B) {
190
benchmarkCrc(b, "min-with-magic", testMinLoc, testMinBlob, calcCrc)
193
func BenchmarkAccessServerCrcWithoutMagicMin(b *testing.B) {
194
benchmarkCrc(b, "min-without-magic", testMinLoc, testMinBlob, calcCrcWithoutMagic)
197
func BenchmarkAccessServerCrcWithMagicMax(b *testing.B) {
198
benchmarkCrc(b, "max-with-magic", testMaxLoc, testMaxBlob, calcCrc)
201
func BenchmarkAccessServerCrcWithoutMagicMax(b *testing.B) {
202
benchmarkCrc(b, "max-without-magic", testMaxLoc, testMaxBlob, calcCrcWithoutMagic)