Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cleanup codec constants #2699

Merged
merged 76 commits into from
Mar 27, 2024
Merged
Show file tree
Hide file tree
Changes from 72 commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
1adc328
E fork scaffolding
abi87 Jan 10, 2024
f6d7382
Merge branch 'dev' into e-fork-scaffolding
abi87 Jan 10, 2024
3889e51
Merge branch 'dev' into e-fork-scaffolding
abi87 Jan 12, 2024
e725961
Merge branch 'dev' into e-fork-scaffolding
abi87 Jan 15, 2024
30a4343
Merge branch 'dev' into e-fork-scaffolding
abi87 Jan 16, 2024
add3a35
Merge branch 'dev' into e-fork-scaffolding
abi87 Jan 17, 2024
3d08216
Merge branch 'dev' into e-fork-scaffolding
abi87 Jan 18, 2024
8f35564
Merge branch 'dev' into e-fork-scaffolding
abi87 Jan 19, 2024
2b16538
Merge branch 'master' into e-fork-scaffolding
abi87 Jan 26, 2024
4751e79
Merge branch 'master' into e-fork-scaffolding
abi87 Jan 29, 2024
e00d7c9
drop temporary fork time
abi87 Jan 29, 2024
b454987
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 1, 2024
f832034
nits
abi87 Feb 1, 2024
62ab6d0
upgraded codec for dynamic fees
abi87 Feb 2, 2024
d33a6a2
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 7, 2024
d846cba
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Feb 7, 2024
8a89505
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 8, 2024
3daec34
cleanup
abi87 Feb 8, 2024
b1fdd62
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Feb 8, 2024
a0020b1
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 9, 2024
1fb0662
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Feb 9, 2024
f28b80b
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 12, 2024
26fcb79
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 13, 2024
4d100eb
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Feb 13, 2024
199424b
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 15, 2024
3b76de5
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Feb 15, 2024
5ea9c0b
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 15, 2024
603fbec
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Feb 15, 2024
2b05cf1
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 16, 2024
0baba01
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Feb 16, 2024
9b97764
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 19, 2024
1368b48
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Feb 19, 2024
a4b81e6
fork switch to the avm
abi87 Feb 20, 2024
392e935
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 21, 2024
78a1a5c
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Feb 21, 2024
d3a733e
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 22, 2024
a362312
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Feb 22, 2024
f735491
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 25, 2024
6a1af7c
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Feb 25, 2024
33e3b70
Merge branch 'master' into e-fork-scaffolding
abi87 Feb 29, 2024
507636e
latestFork in avm
abi87 Feb 29, 2024
399dfc8
default test config for a few unit tests
abi87 Feb 29, 2024
089af5e
come more unit tests helpers
abi87 Feb 29, 2024
bf58efb
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Feb 29, 2024
3c52428
Merge branch 'master' into e-fork-scaffolding
abi87 Mar 4, 2024
198c910
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Mar 4, 2024
e34e3de
Merge branch 'master' into e-fork-scaffolding
abi87 Mar 5, 2024
7feb04f
Merge branch 'master' into e-fork-scaffolding
abi87 Mar 6, 2024
43169f4
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Mar 6, 2024
7d7d1f7
Merge branch 'master' into e-fork-scaffolding
abi87 Mar 7, 2024
2dd14a8
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Mar 7, 2024
5992b33
Merge branch 'master' into e-fork-scaffolding
abi87 Mar 11, 2024
d5ccb3b
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Mar 11, 2024
dca34a5
fixed merge
abi87 Mar 11, 2024
cda811f
Merge branch 'master' into e-fork-scaffolding
abi87 Mar 11, 2024
cd989f3
nits from code reviews
abi87 Mar 11, 2024
32da156
some more nits from code reviews
abi87 Mar 11, 2024
be7cf3e
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Mar 11, 2024
d2525d5
fixed merge
abi87 Mar 11, 2024
ae8231b
Merge branch 'master' into e-fork-scaffolding
abi87 Mar 12, 2024
8270220
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Mar 12, 2024
95d3ab5
Merge branch 'master' into e-fork-scaffolding
abi87 Mar 13, 2024
7a17a9b
drop DurangoTime from avm config
abi87 Mar 13, 2024
2906756
nit
abi87 Mar 13, 2024
d3edbaa
nit
abi87 Mar 13, 2024
3dbdd6b
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Mar 13, 2024
737d429
Merge branch 'master' into e-fork-scaffolding
abi87 Mar 18, 2024
b47ef55
Merge branch 'e-fork-scaffolding' into codec_upgrades_dynamic_fees
abi87 Mar 18, 2024
ee6bd99
Merge branch 'master' into codec_upgrades_dynamic_fees
abi87 Mar 19, 2024
cede533
Merge branch 'master' into codec_upgrades_dynamic_fees
abi87 Mar 20, 2024
d2772ec
Merge branch 'master' into codec_upgrades_dynamic_fees
abi87 Mar 22, 2024
50e75f9
Merge branch 'master' into codec_upgrades_dynamic_fees
abi87 Mar 25, 2024
6f36d2e
Merge branch 'master' into codec_upgrades_dynamic_fees
abi87 Mar 26, 2024
b2e0b3e
Merge branch 'master' into codec_upgrades_dynamic_fees
abi87 Mar 27, 2024
bd2311e
reverted unnecessary changes
abi87 Mar 27, 2024
799b355
nit
StephenButtolph Mar 27, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 4 additions & 2 deletions codec/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import (
)

const (
CodecVersionSize = wrappers.ShortLen
StephenButtolph marked this conversation as resolved.
Show resolved Hide resolved

// default max size, in bytes, of something being marshalled by Marshal()
defaultMaxSize = 256 * units.KiB

Expand Down Expand Up @@ -102,8 +104,8 @@ func (m *manager) Size(version uint16, value interface{}) (int, error) {

res, err := c.Size(value)

// Add [wrappers.ShortLen] for the codec version
return wrappers.ShortLen + res, err
// Add [CodecVersionSize] for the codec version
return CodecVersionSize + res, err
}

// To marshal an interface, [value] must be a pointer to the interface.
Expand Down
20 changes: 7 additions & 13 deletions codec/reflectcodec/type_codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ const (
var (
_ codec.Codec = (*genericCodec)(nil)

errMarshalNil = errors.New("can't marshal nil pointer or interface")
errUnmarshalNil = errors.New("can't unmarshal nil")
errNeedPointer = errors.New("argument to unmarshal must be a pointer")
errRecursiveInterfaceTypes = errors.New("recursive interface types")
)
Expand Down Expand Up @@ -84,7 +82,7 @@ func New(typer TypeCodec, tagNames []string) codec.Codec {

func (c *genericCodec) Size(value interface{}) (int, error) {
if value == nil {
return 0, errMarshalNil // can't marshal nil
return 0, nil // can't marshal nil, we return zero size
StephenButtolph marked this conversation as resolved.
Show resolved Hide resolved
}

size, _, err := c.size(reflect.ValueOf(value), nil /*=typeStack*/)
Expand Down Expand Up @@ -120,14 +118,14 @@ func (c *genericCodec) size(
return wrappers.StringLen(value.String()), false, nil
case reflect.Ptr:
if value.IsNil() {
return 0, false, errMarshalNil
return 0, false, nil // can't marshal nil, we return zero size
}

return c.size(value.Elem(), typeStack)

case reflect.Interface:
if value.IsNil() {
return 0, false, errMarshalNil
return 0, false, nil // can't marshal nil, we return zero size
}

underlyingValue := value.Interface()
Expand All @@ -154,10 +152,6 @@ func (c *genericCodec) size(
return 0, false, err
}

if size == 0 {
return 0, false, fmt.Errorf("can't marshal slice of zero length values: %w", codec.ErrMarshalZeroLength)
}

// For fixed-size types we manually calculate lengths rather than
// processing each element separately to improve performance.
if constSize {
Expand Down Expand Up @@ -294,7 +288,7 @@ func (c *genericCodec) size(
// To marshal an interface, [value] must be a pointer to the interface
func (c *genericCodec) MarshalInto(value interface{}, p *wrappers.Packer) error {
if value == nil {
return errMarshalNil // can't marshal nil
return codec.ErrMarshalNil // can't marshal nil
}

return c.marshal(reflect.ValueOf(value), p, nil /*=typeStack*/)
Expand Down Expand Up @@ -341,13 +335,13 @@ func (c *genericCodec) marshal(
return p.Err
case reflect.Ptr:
if value.IsNil() {
return errMarshalNil
return codec.ErrMarshalNil
}

return c.marshal(value.Elem(), p, typeStack)
case reflect.Interface:
if value.IsNil() {
return errMarshalNil
return codec.ErrMarshalNil
}

underlyingValue := value.Interface()
Expand Down Expand Up @@ -502,7 +496,7 @@ func (c *genericCodec) marshal(
// interface
func (c *genericCodec) Unmarshal(bytes []byte, dest interface{}) error {
if dest == nil {
return errUnmarshalNil
return codec.ErrUnmarshalNil
StephenButtolph marked this conversation as resolved.
Show resolved Hide resolved
}

p := wrappers.Packer{
Expand Down
86 changes: 85 additions & 1 deletion codec/test_codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,15 @@ import (
"testing"

"github.com/stretchr/testify/require"

"github.com/ava-labs/avalanchego/utils/wrappers"
)

var (
Tests = []func(c GeneralCodec, t testing.TB){
TestStruct,
TestPartiallyFilledStruct,
TestSliceWithEmptyElements,
TestRegisterStructTwice,
TestUInt32,
TestUIntPtr,
Expand Down Expand Up @@ -241,6 +245,85 @@ func TestStruct(codec GeneralCodec, t testing.TB) {
require.Equal(myStructInstance, *myStructUnmarshaled)
}

func TestPartiallyFilledStruct(codec GeneralCodec, t testing.TB) {
require := require.New(t)

manager := NewDefaultManager()
require.NoError(manager.RegisterCodec(0, codec))

// a nil pointer cannot be marshalled but we can get its size
var nilStruct *myStruct
_, err := manager.Marshal(0, nilStruct)
require.ErrorIs(err, ErrMarshalNil)

bytesLen, err := manager.Size(0, nilStruct)
require.NoError(err)
require.Equal(CodecVersionSize, bytesLen)

// an empty struct cannot be marshalled but we can get its size
emptyStruct := &myStruct{}
_, err = manager.Marshal(0, nilStruct)
require.ErrorIs(err, ErrMarshalNil)

emptyStructLen := CodecVersionSize + 117
bytesLen, err = manager.Size(0, emptyStruct)
require.NoError(err)
require.Equal(emptyStructLen, bytesLen)

// an partially filled struct cannot be marshalled but we can get its size
elem := &MyInnerStruct{
Str: "a",
}
elemLen := CodecVersionSize + wrappers.StringLen(elem.Str)

partialStruct := &myStruct{
InnerStruct2: elem,
}
partialStructLen := emptyStructLen + elemLen - CodecVersionSize
bytesLen, err = manager.Size(0, partialStruct)
require.NoError(err)
require.Equal(partialStructLen, bytesLen)
}

func TestSliceWithEmptyElements(codec GeneralCodec, t testing.TB) {
require := require.New(t)

manager := NewDefaultManager()
require.NoError(manager.RegisterCodec(0, codec))

// a non-empty slice with nil pointers cannot be marshalled but we can get its size
slice := make([]*MyInnerStruct, 10)

_, err := manager.Marshal(0, slice)
require.ErrorIs(err, ErrMarshalNil)

emptySliceLen := CodecVersionSize + wrappers.IntLen // Codec version + slice size. Slice elements have zero size
bytesLen, err := manager.Size(0, slice)
require.NoError(err)
require.Equal(emptySliceLen, bytesLen)

elem := &MyInnerStruct{
Str: "aaa",
}
elemLen := CodecVersionSize + wrappers.StringLen(elem.Str)
bytesLen, err = manager.Size(0, elem)
require.NoError(err)
require.Equal(elemLen, bytesLen)

// we can fill some elements and leave other empty. Size will be sub-additive
slice[1] = elem
sliceLen := emptySliceLen + elemLen - CodecVersionSize // codec version is marshelled only once
bytesLen, err = manager.Size(0, slice)
require.NoError(err)
require.Equal(sliceLen, bytesLen)

slice[5] = elem
sliceLen += elemLen - CodecVersionSize // codec version is marshelled only once
bytesLen, err = manager.Size(0, slice)
require.NoError(err)
require.Equal(sliceLen, bytesLen)
}

func TestRegisterStructTwice(codec GeneralCodec, t testing.TB) {
require := require.New(t)

Expand Down Expand Up @@ -773,8 +856,9 @@ func TestSliceWithEmptySerializationError(codec GeneralCodec, t testing.TB) {
_, err := manager.Marshal(0, val)
require.ErrorIs(err, ErrMarshalZeroLength)

// we cannot marshal/unmarshal an empty slice, but we can ask its size
_, err = manager.Size(0, val)
require.ErrorIs(err, ErrMarshalZeroLength)
require.NoError(err)

b := []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x01} // codec version (0x00, 0x00) then (0x00, 0x00, 0x00, 0x01) for numElts

Expand Down
3 changes: 2 additions & 1 deletion vms/platformvm/state/metadata_validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package state
import (
"time"

"github.com/ava-labs/avalanchego/codec"
"github.com/ava-labs/avalanchego/database"
"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/utils/constants"
Expand All @@ -17,7 +18,7 @@ import (
// [preDelegateeRewardMetadata].
//
// CodecVersionLen + UpDurationLen + LastUpdatedLen + PotentialRewardLen
const preDelegateeRewardSize = wrappers.ShortLen + 3*wrappers.LongLen
const preDelegateeRewardSize = codec.CodecVersionSize + 3*wrappers.LongLen

var _ validatorState = (*metadata)(nil)

Expand Down