mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00

This commit removes the `XXX_NoUnkeyedLiteral`, `XXX_unrecognized`, and `XXX_sizecache` auto-generated fields from generated protobuf structs in the raft package. This was done for all of the same reasons CockroachDB removed the generation of these fields in https://github.com/cockroachdb/cockroach/pull/38404. They come with very limited advantages but moderate disadvantages. `XXX_NoUnkeyedLiteral` and `XXX_sizecache` were only enabled recently in cc7b4fa, and this appears to have been unintentional. Meanwhile, `XXX_unrecognized` has been around for longer and has arguably more reason to stay because it can assist with forwards compatibility. However, any real mixed-version upgrade story for this package is mostly untold at this point, and keeping this field seems just as likely to cause unexpected bugs (e.g. a field was propagated but not updated correctly when passed through an old version) as it seems to fix real issues, so it also doesn't warrant its cost. This reduces the in-memory representation size of all Raft protos. Notably, it reduces the memory size of an `Entry` proto from *80 bytes* to *48 bytes* and the memory size of a `Message` proto from *392 bytes* to *264 bytes*. Both of these structs are used frequently, and often in slices, where this wasted space really starts to add up. This was motivated by a regression in microbenchmarks in CockroachDB due to cc7b4fa, which was caught in https://github.com/cockroachdb/cockroach/issues/62212.
65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
// Copyright 2021 The etcd Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package raftpb
|
|
|
|
import (
|
|
"math/bits"
|
|
"testing"
|
|
"unsafe"
|
|
)
|
|
|
|
func TestProtoMemorySizes(t *testing.T) {
|
|
assert := func(size, exp uintptr, name string) {
|
|
t.Helper()
|
|
if size != exp {
|
|
t.Errorf("expected size of %s proto to be %d bytes, found %d bytes", name, exp, size)
|
|
}
|
|
}
|
|
|
|
if64Bit := func(yes, no uintptr) uintptr {
|
|
if bits.UintSize == 64 {
|
|
return yes
|
|
}
|
|
return no
|
|
}
|
|
|
|
var e Entry
|
|
assert(unsafe.Sizeof(e), if64Bit(48, 32), "Entry")
|
|
|
|
var sm SnapshotMetadata
|
|
assert(unsafe.Sizeof(sm), if64Bit(120, 68), "SnapshotMetadata")
|
|
|
|
var s Snapshot
|
|
assert(unsafe.Sizeof(s), if64Bit(144, 80), "Snapshot")
|
|
|
|
var m Message
|
|
assert(unsafe.Sizeof(m), if64Bit(264, 168), "Message")
|
|
|
|
var hs HardState
|
|
assert(unsafe.Sizeof(hs), 24, "HardState")
|
|
|
|
var cs ConfState
|
|
assert(unsafe.Sizeof(cs), if64Bit(104, 52), "ConfState")
|
|
|
|
var cc ConfChange
|
|
assert(unsafe.Sizeof(cc), if64Bit(48, 32), "ConfChange")
|
|
|
|
var ccs ConfChangeSingle
|
|
assert(unsafe.Sizeof(ccs), if64Bit(16, 12), "ConfChangeSingle")
|
|
|
|
var ccv2 ConfChangeV2
|
|
assert(unsafe.Sizeof(ccv2), if64Bit(56, 28), "ConfChangeV2")
|
|
}
|