From c3a70398018178afac6b8251462f6d7645f6602d Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Mon, 27 Feb 2023 16:16:37 +0300 Subject: [PATCH] [TrueCloudLab/hrw#2] node: Optimize shard hash Compute shard hash only once Signed-off-by: Dmitrii Stepanov --- pkg/local_object_storage/engine/engine.go | 4 ++-- .../engine/engine_test.go | 10 +++++++--- pkg/local_object_storage/engine/shards.go | 20 +++++++++++-------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/pkg/local_object_storage/engine/engine.go b/pkg/local_object_storage/engine/engine.go index f34d5c0bd4..cacb23b8e6 100644 --- a/pkg/local_object_storage/engine/engine.go +++ b/pkg/local_object_storage/engine/engine.go @@ -19,7 +19,7 @@ type StorageEngine struct { mtx *sync.RWMutex - shards map[string]shardWrapper + shards map[string]hashedShard shardPools map[string]util.WorkerPool @@ -223,7 +223,7 @@ func New(opts ...Option) *StorageEngine { return &StorageEngine{ cfg: c, mtx: new(sync.RWMutex), - shards: make(map[string]shardWrapper), + shards: make(map[string]hashedShard), shardPools: make(map[string]util.WorkerPool), closeCh: make(chan struct{}), setModeCh: make(chan setModeRequest), diff --git a/pkg/local_object_storage/engine/engine_test.go b/pkg/local_object_storage/engine/engine_test.go index d554d3773f..69514b5320 100644 --- a/pkg/local_object_storage/engine/engine_test.go +++ b/pkg/local_object_storage/engine/engine_test.go @@ -21,6 +21,7 @@ import ( oidtest "github.com/TrueCloudLab/frostfs-sdk-go/object/id/test" usertest "github.com/TrueCloudLab/frostfs-sdk-go/user/test" "github.com/TrueCloudLab/frostfs-sdk-go/version" + "github.com/TrueCloudLab/hrw" "github.com/TrueCloudLab/tzhash/tz" "github.com/panjf2000/ants/v2" "github.com/stretchr/testify/require" @@ -86,9 +87,12 @@ func testNewEngineWithShards(shards ...*shard.Shard) *StorageEngine { panic(err) } - engine.shards[s.ID().String()] = shardWrapper{ - errorCount: atomic.NewUint32(0), - Shard: s, + engine.shards[s.ID().String()] = hashedShard{ + shardWrapper: shardWrapper{ + errorCount: atomic.NewUint32(0), + Shard: s, + }, + hash: hrw.Hash([]byte(s.ID().String())), } engine.shardPools[s.ID().String()] = pool } diff --git a/pkg/local_object_storage/engine/shards.go b/pkg/local_object_storage/engine/shards.go index a6ab92e557..9341be9f9d 100644 --- a/pkg/local_object_storage/engine/shards.go +++ b/pkg/local_object_storage/engine/shards.go @@ -16,7 +16,10 @@ import ( var errShardNotFound = logicerr.New("shard not found") -type hashedShard shardWrapper +type hashedShard struct { + shardWrapper + hash uint64 +} type metricsWithID struct { id string @@ -127,9 +130,12 @@ func (e *StorageEngine) addShard(sh *shard.Shard) error { return fmt.Errorf("shard with id %s was already added", strID) } - e.shards[strID] = shardWrapper{ - errorCount: atomic.NewUint32(0), - Shard: sh, + e.shards[strID] = hashedShard{ + shardWrapper: shardWrapper{ + errorCount: atomic.NewUint32(0), + Shard: sh, + }, + hash: hrw.Hash([]byte(strID)), } e.shardPools[strID] = pool @@ -144,7 +150,7 @@ func (e *StorageEngine) removeShards(ids ...string) { return } - ss := make([]shardWrapper, 0, len(ids)) + ss := make([]hashedShard, 0, len(ids)) e.mtx.Lock() for _, id := range ids { @@ -276,7 +282,5 @@ func (e *StorageEngine) HandleNewEpoch(epoch uint64) { } func (s hashedShard) Hash() uint64 { - return hrw.Hash( - []byte(s.Shard.ID().String()), - ) + return s.hash }