diff --git a/pkg/entities/dynamic_config.go b/pkg/entities/dynamic_config.go index 378f78a..bd13d6e 100644 --- a/pkg/entities/dynamic_config.go +++ b/pkg/entities/dynamic_config.go @@ -39,10 +39,10 @@ type DynamicConfig struct { ExcludeSelfMessages bool `db:"exclude_self_messages" yaml:"exclude_self_messages" json:"exclude_self_messages"` // Coding and message settings - RandomMessageSize int64 `db:"random_message_size_bytes" yaml:"random_message_size" json:"random_message_size_bytes"` - ShardFactor int64 `db:"rlnc_shard_factor" yaml:"shard_factor" json:"rlnc_shard_factor"` - PublisherShardMultiplier float32 `db:"publisher_shard_multiplier" yaml:"publisher_shard_multiplier" json:"publisher_shard_multiplier"` - ForwardShardThreshold float32 `db:"forward_shard_threshold" yaml:"forward_shard_threshold" json:"forward_shard_threshold"` + RandomMessageSize uint32 `db:"random_message_size_bytes" yaml:"random_message_size" json:"random_message_size_bytes"` + ShardFactor uint32 `db:"rlnc_shard_factor" yaml:"shard_factor" json:"rlnc_shard_factor"` + PublisherShardMultiplier float64 `db:"publisher_shard_multiplier" yaml:"publisher_shard_multiplier" json:"publisher_shard_multiplier"` + ForwardShardThreshold float64 `db:"forward_shard_threshold" yaml:"forward_shard_threshold" json:"forward_shard_threshold"` // Mesh topology settings MeshDegreeTarget int64 `db:"mesh_degree_target" yaml:"mesh_degree_target" json:"mesh_degree_target"` @@ -138,10 +138,10 @@ func (d *DynamicConfig) ToMap() map[string]any { func HashRemoteConfig(cfg *DynamicConfig) string { h := sha256.New() hash.WriteBool(h, cfg.PropagationEnabled) - hash.WriteInt64(h, cfg.RandomMessageSize) - hash.WriteInt64(h, cfg.ShardFactor) - hash.WriteFloat32(h, cfg.PublisherShardMultiplier) - hash.WriteFloat32(h, cfg.ForwardShardThreshold) + hash.WriteUint32(h, cfg.RandomMessageSize) + hash.WriteUint32(h, cfg.ShardFactor) + hash.WriteFloat64(h, cfg.PublisherShardMultiplier) + hash.WriteFloat64(h, cfg.ForwardShardThreshold) hash.WriteInt64(h, cfg.MeshDegreeTarget) hash.WriteInt64(h, cfg.MeshDegreeMin) hash.WriteInt64(h, cfg.MeshDegreeMax) diff --git a/pkg/entities/dynamic_config_test.go b/pkg/entities/dynamic_config_test.go index 5429ec8..22e7615 100644 --- a/pkg/entities/dynamic_config_test.go +++ b/pkg/entities/dynamic_config_test.go @@ -92,10 +92,10 @@ func TestDynamicConfig(t *testing.T) { "propagation_enabled": true, "exclude_self_messages": true, "updated_at": res["updated_at"], - "random_message_size_bytes": int64(1), - "rlnc_shard_factor": int64(2), - "publisher_shard_multiplier": float32(3), - "forward_shard_threshold": float32(4), + "random_message_size_bytes": uint32(1), + "rlnc_shard_factor": uint32(2), + "publisher_shard_multiplier": float64(3), + "forward_shard_threshold": float64(4), "mesh_degree_target": int64(5), "mesh_degree_min": int64(6), "mesh_degree_max": int64(7), @@ -106,7 +106,7 @@ func TestHashRemoteConfig(t *testing.T) { // given table := map[string]*entities.DynamicConfig{ "cc2786e1f9910a9d811400edcddaf7075195f7a16b216dcbefba3bc7c4f2ae51": {}, - "db60d9b58747f20f922f9660d71631d4b26465836096857cd53eca21883dbad8": { + "e1600a51a6acec2ea4168f23e112489b40af724b8901ac744c82fe105a1a73d7": { RandomMessageSize: 1, ShardFactor: 1, PublisherShardMultiplier: 1, @@ -115,7 +115,7 @@ func TestHashRemoteConfig(t *testing.T) { MeshDegreeMin: 1, MeshDegreeMax: 1, }, - "6a6daffb5ebc958a231ab5099b2d935bf5916e3e4eeab44f8f9c70016d72b672": { + "9049b56b4dc78f6fa24106b9e31e9c5dc987c028953440f2eb77b67009398ba0": { RandomMessageSize: 2, ShardFactor: 2, PublisherShardMultiplier: 2, @@ -124,7 +124,7 @@ func TestHashRemoteConfig(t *testing.T) { MeshDegreeMin: 2, MeshDegreeMax: 2, }, - "f7dbb42586df129bfc7cadcaf952db8256c174915e4ac301cba67a3a2144153e": { + "92dcf1a7e3b3bd8193dbf48f250ca6c1bf95954ca6537c699c7b8007c358bad2": { RandomMessageSize: 2, ShardFactor: 2, PublisherShardMultiplier: 2, diff --git a/pkg/entities/opt_p2p.go b/pkg/entities/opt_p2p.go index 99c9427..a1d78ea 100644 --- a/pkg/entities/opt_p2p.go +++ b/pkg/entities/opt_p2p.go @@ -15,10 +15,10 @@ type OptimumConfig struct { MaxMessageSize int64 `yaml:"max_message_size_bytes" env:"OPTIMUM_MAX_MSG_SIZE" flag:"max_message_size_bytes" default:"1048576"` // Coding and message settings - RandomMessageSize int64 `yaml:"random_message_size_bytes" env:"OPTIMUM_RANDOM_MSG_SIZE" flag:"random_message_size_bytes" default:"512"` - ShardFactor int64 `yaml:"rlnc_shard_factor" env:"OPTIMUM_SHARD_FACTOR" flag:"rlnc_shard_factor" default:"4"` - PublisherShardMultiplier float32 `yaml:"publisher_shard_multiplier" env:"OPTIMUM_SHARD_MULT" flag:"publisher_shard_multiplier" default:"1.5"` - ForwardShardThreshold float32 `yaml:"forward_shard_threshold" env:"OPTIMUM_THRESHOLD" flag:"forward_shard_threshold" default:"0.75"` + RandomMessageSize uint32 `yaml:"random_message_size_bytes" env:"OPTIMUM_RANDOM_MSG_SIZE" flag:"random_message_size_bytes" default:"512"` + ShardFactor uint32 `yaml:"rlnc_shard_factor" env:"OPTIMUM_SHARD_FACTOR" flag:"rlnc_shard_factor" default:"4"` + PublisherShardMultiplier float64 `yaml:"publisher_shard_multiplier" env:"OPTIMUM_SHARD_MULT" flag:"publisher_shard_multiplier" default:"1.5"` + ForwardShardThreshold float64 `yaml:"forward_shard_threshold" env:"OPTIMUM_THRESHOLD" flag:"forward_shard_threshold" default:"0.75"` // Mesh topology settings MeshDegreeTarget int64 `yaml:"mesh_degree_target" env:"OPTIMUM_MESH_TARGET" flag:"mesh_degree_target" default:"6"` diff --git a/pkg/entities/opt_p2p_test.go b/pkg/entities/opt_p2p_test.go index aaed482..150a644 100644 --- a/pkg/entities/opt_p2p_test.go +++ b/pkg/entities/opt_p2p_test.go @@ -19,10 +19,10 @@ func TestOptimumConfig(t *testing.T) { require.NoError(t, cfg.Validate()) require.Equal(t, "test-cluster", cfg.ClusterID) require.Equal(t, int64(1048576), cfg.MaxMessageSize) - require.Equal(t, int64(512), cfg.RandomMessageSize) - require.Equal(t, int64(4), cfg.ShardFactor) - require.Equal(t, float32(1.5), cfg.PublisherShardMultiplier) - require.Equal(t, float32(0.75), cfg.ForwardShardThreshold) + require.Equal(t, uint32(512), cfg.RandomMessageSize) + require.Equal(t, uint32(4), cfg.ShardFactor) + require.Equal(t, float64(1.5), cfg.PublisherShardMultiplier) + require.Equal(t, float64(0.75), cfg.ForwardShardThreshold) require.Equal(t, int64(6), cfg.MeshDegreeTarget) require.Equal(t, int64(4), cfg.MeshDegreeMin) require.Equal(t, int64(12), cfg.MeshDegreeMax) @@ -46,10 +46,10 @@ func TestOptimumConfig(t *testing.T) { newCfg := cfg.ApplyDynamicConfig(dc) // then - require.Equal(t, int64(1024), newCfg.RandomMessageSize) - require.Equal(t, int64(8), newCfg.ShardFactor) - require.Equal(t, float32(3), newCfg.PublisherShardMultiplier) - require.Equal(t, float32(1.23), newCfg.ForwardShardThreshold) + require.Equal(t, uint32(1024), newCfg.RandomMessageSize) + require.Equal(t, uint32(8), newCfg.ShardFactor) + require.Equal(t, float64(3), newCfg.PublisherShardMultiplier) + require.Equal(t, 1.23, newCfg.ForwardShardThreshold) require.Equal(t, int64(32), newCfg.MeshDegreeTarget) require.Equal(t, int64(64), newCfg.MeshDegreeMin) require.Equal(t, int64(128), newCfg.MeshDegreeMax) diff --git a/pkg/hash/hashutil.go b/pkg/hash/hashutil.go index 97c0864..c8d6064 100644 --- a/pkg/hash/hashutil.go +++ b/pkg/hash/hashutil.go @@ -111,3 +111,17 @@ func WriteFloat32(h hash.Hash, v float32) { binary.LittleEndian.PutUint32(buf[:], math.Float32bits(v)) h.Write(buf[:]) } + +// WriteFloat64 writes a float64 value to the hash by converting it to its IEEE 754 binary representation. +func WriteFloat64(h hash.Hash, v float64) { + var buf [8]byte + binary.LittleEndian.PutUint64(buf[:], math.Float64bits(v)) + h.Write(buf[:]) +} + +// WriteUint32 writes a uint32 value to the hash in little-endian format. +func WriteUint32(h hash.Hash, v uint32) { + var buf [4]byte + binary.LittleEndian.PutUint32(buf[:], v) + h.Write(buf[:]) +}