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

Trie storage statistics component #5401

Merged
merged 45 commits into from
Nov 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
b509c81
storage statistics component in storage package
ssd04 Jul 5, 2023
94db95c
addapt storage statistics component in statusCoreComponents
ssd04 Jul 5, 2023
bdcb008
Revert "addapt storage statistics component in statusCoreComponents"
ssd04 Jul 5, 2023
4e02971
use stats component in trie storage manager
ssd04 Jul 6, 2023
5ba1393
refactor trie statistics component
ssd04 Jul 6, 2023
1be0bd0
update storer with stats interface
ssd04 Jul 7, 2023
1a7db42
fix trie package tests
ssd04 Jul 7, 2023
2471b82
refactor to cast storagemanager in constructor
ssd04 Jul 14, 2023
261c492
fix epoch start unit tests
ssd04 Jul 17, 2023
088a9ac
Merge branch 'rc/v1.6.0' into trie-storage-statistics-component
ssd04 Jul 17, 2023
1b5b5de
fix test in epochstart and integration tests
ssd04 Jul 17, 2023
68cba11
add missing comments
ssd04 Jul 18, 2023
a352567
fix benchmarks integration test
ssd04 Jul 18, 2023
c990e1d
fix linter issue
ssd04 Jul 18, 2023
8aeac06
Merge branch 'rc/v1.6.0' into trie-storage-statistics-component
ssd04 Jul 26, 2023
c0afd2a
fixes after review
ssd04 Aug 7, 2023
8703e00
update trie stub
ssd04 Aug 7, 2023
239929d
Merge branch 'rc/v1.6.0' into trie-storage-statistics-component
ssd04 Sep 4, 2023
7a8fbb4
fix unit tests after merge
ssd04 Sep 4, 2023
c646309
move state stats collector in common
ssd04 Sep 6, 2023
dc3b665
Merge branch 'rc/v1.6.0' into trie-storage-statistics-component
ssd04 Oct 5, 2023
d8e86ed
cleanup trie stats handler
ssd04 Oct 6, 2023
185ea39
separate stats for sync and snapshot
ssd04 Oct 9, 2023
082a009
use atomic map from sync package
ssd04 Oct 10, 2023
f6dc8ed
renamings and comments + fix unit tests
ssd04 Oct 10, 2023
1caef49
fix unit tests - epochstart boostrap and factory
ssd04 Oct 10, 2023
3f566ec
fix integration tests
ssd04 Oct 10, 2023
aa16716
more unit tests + remove old code
ssd04 Oct 10, 2023
77f1f4a
snapshot manager stats
ssd04 Oct 10, 2023
20c0b03
fixes after review
ssd04 Oct 25, 2023
08225bd
fix test
ssd04 Oct 25, 2023
1278c3b
remove trie sync statistics
ssd04 Oct 25, 2023
55b9a70
remove unused code
ssd04 Oct 25, 2023
020f987
fix mutex usage
ssd04 Oct 25, 2023
d45437b
Merge branch 'rc/v1.6.0' into trie-storage-statistics-component
ssd04 Oct 26, 2023
9593d18
Merge branch 'rc/v1.7.0' into trie-storage-statistics-component
ssd04 Oct 26, 2023
ee9c8b6
revert changes from d45437b
ssd04 Oct 26, 2023
a444c20
fix unit test
ssd04 Oct 26, 2023
343e7c8
Merge branch 'rc/v1.7.0' into trie-storage-statistics-component
ssd04 Oct 30, 2023
2b19dd3
update stats return format
ssd04 Oct 30, 2023
97ad360
revert additional changes from 343e7c8
ssd04 Oct 30, 2023
63b2a82
Merge branch 'rc/v1.7.0' into trie-storage-statistics-component
ssd04 Nov 2, 2023
6a4be57
fix integration tests
ssd04 Nov 3, 2023
c192ba4
fix hardfork integration test
ssd04 Nov 3, 2023
d2f3f82
fix create prunning storer maps epoch
ssd04 Nov 6, 2023
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
25 changes: 25 additions & 0 deletions common/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ type StorageManager interface {
type TrieStorageInteractor interface {
BaseStorer
GetIdentifier() string
GetStateStatsHandler() StateStatisticsHandler
}

// BaseStorer define the base methods needed for a storer
Expand Down Expand Up @@ -216,6 +217,30 @@ type TriesStatisticsCollector interface {
GetNumNodes() uint64
}

// StateStatisticsHandler defines the behaviour of a storage statistics handler
type StateStatisticsHandler interface {
Reset()
ResetSnapshot()

IncrCache()
Cache() uint64
IncrSnapshotCache()
SnapshotCache() uint64

IncrPersister(epoch uint32)
Persister(epoch uint32) uint64
IncrSnapshotPersister(epoch uint32)
SnapshotPersister(epoch uint32) uint64

IncrTrie()
Trie() uint64

ProcessingStats() []string
SnapshotStats() []string

IsInterfaceNil() bool
}

// ProcessStatusHandler defines the behavior of a component able to hold the current status of the node and
// able to tell if the node is idle or processing/committing a block
type ProcessStatusHandler interface {
Expand Down
80 changes: 80 additions & 0 deletions common/statistics/disabled/stateStatistics.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package disabled

type stateStatistics struct{}

// NewStateStatistics will create a new disabled statistics component
func NewStateStatistics() *stateStatistics {
return &stateStatistics{}
}

// ResetAll does nothing
func (s *stateStatistics) ResetAll() {
}

// Reset does nothing
func (s *stateStatistics) Reset() {
}

// ResetSnapshot does nothing
func (s *stateStatistics) ResetSnapshot() {
}

// IncrCache does nothing
func (s *stateStatistics) IncrCache() {
}

// Cache returns zero
func (s *stateStatistics) Cache() uint64 {
return 0
}

// IncrSnapshotCache does nothing
func (ss *stateStatistics) IncrSnapshotCache() {
}

// SnapshotCache returns the number of cached operations
func (ss *stateStatistics) SnapshotCache() uint64 {
return 0
}

// IncrPersister does nothing
func (s *stateStatistics) IncrPersister(epoch uint32) {
}

// Persister returns zero
func (s *stateStatistics) Persister(epoch uint32) uint64 {
return 0
}

// IncrSnapshotPersister does nothing
func (ss *stateStatistics) IncrSnapshotPersister(epoch uint32) {
}

// SnapshotPersister returns the number of persister operations
func (ss *stateStatistics) SnapshotPersister(epoch uint32) uint64 {
return 0
}

// IncrTrie does nothing
func (s *stateStatistics) IncrTrie() {
}

// Trie returns zero
func (s *stateStatistics) Trie() uint64 {
return 0
}

// ProcessingStats returns nil
func (s *stateStatistics) ProcessingStats() []string {
return nil
}

// SnapshotStats returns nil
func (s *stateStatistics) SnapshotStats() []string {
return nil
}

// IsInterfaceNil returns true if there is no value under the interface
func (s *stateStatistics) IsInterfaceNil() bool {
return s == nil
}
46 changes: 46 additions & 0 deletions common/statistics/disabled/stateStatistics_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package disabled
BeniaminDrasovean marked this conversation as resolved.
Show resolved Hide resolved

import (
"fmt"
"testing"

"github.com/multiversx/mx-chain-core-go/core/check"
"github.com/stretchr/testify/require"
)

func TestNewDisabledStateStatistics(t *testing.T) {
t.Parallel()

stats := NewStateStatistics()
require.False(t, check.IfNil(stats))
}

func TestStateStatistics_MethodsShouldNotPanic(t *testing.T) {
t.Parallel()

defer func() {
r := recover()
if r != nil {
require.Fail(t, fmt.Sprintf("should have not panicked %v", r))
}
}()

stats := NewStateStatistics()

stats.Reset()
stats.ResetSnapshot()
stats.ResetAll()

stats.IncrCache()
stats.IncrSnapshotCache()
stats.IncrSnapshotCache()
stats.IncrPersister(1)
stats.IncrSnapshotPersister(1)
stats.IncrTrie()

require.Equal(t, uint64(0), stats.Cache())
require.Equal(t, uint64(0), stats.SnapshotCache())
require.Equal(t, uint64(0), stats.Persister(1))
require.Equal(t, uint64(0), stats.SnapshotPersister(1))
require.Equal(t, uint64(0), stats.Trie())
}
3 changes: 3 additions & 0 deletions common/statistics/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,6 @@ var ErrNilNetworkStatisticsProvider = errors.New("nil network statistics provide

// ErrInvalidRefreshIntervalValue signals that an invalid value for the refresh interval was provided
var ErrInvalidRefreshIntervalValue = errors.New("invalid refresh interval value")

// ErrNilStateStatsHandler signals that a nil state statistics handler was provided
var ErrNilStateStatsHandler = errors.New("nil state statistics handler")
153 changes: 153 additions & 0 deletions common/statistics/stateStatistics.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
package statistics

import (
"fmt"
"sync"
"sync/atomic"
)

type stateStatistics struct {
numCache uint64
numSnapshotCache uint64

numPersister map[uint32]uint64
numSnapshotPersister map[uint32]uint64
mutPersisters sync.RWMutex

numTrie uint64
}

// NewStateStatistics returns a structure able to collect statistics for state
func NewStateStatistics() *stateStatistics {
return &stateStatistics{
numPersister: make(map[uint32]uint64),
numSnapshotPersister: make(map[uint32]uint64),
}
}

// ResetAll will reset all statistics
func (ss *stateStatistics) ResetAll() {
ss.Reset()
ss.ResetSnapshot()
}

// Reset will reset processing statistics
func (ss *stateStatistics) Reset() {
atomic.StoreUint64(&ss.numCache, 0)

ss.mutPersisters.Lock()
ss.numPersister = make(map[uint32]uint64)
ss.mutPersisters.Unlock()

atomic.StoreUint64(&ss.numTrie, 0)
}

// ResetSnapshot will reset snapshot statistics
func (ss *stateStatistics) ResetSnapshot() {
atomic.StoreUint64(&ss.numSnapshotCache, 0)

ss.mutPersisters.Lock()
ss.numSnapshotPersister = make(map[uint32]uint64)
ss.mutPersisters.Unlock()
}

// IncrCache will increment cache counter
func (ss *stateStatistics) IncrCache() {
atomic.AddUint64(&ss.numCache, 1)
}

// Cache returns the number of cached operations
func (ss *stateStatistics) Cache() uint64 {
return atomic.LoadUint64(&ss.numCache)
}

// IncrSnapshotCache will increment snapshot cache counter
func (ss *stateStatistics) IncrSnapshotCache() {
atomic.AddUint64(&ss.numSnapshotCache, 1)
}

// SnapshotCache returns the number of snapshot cached operations
func (ss *stateStatistics) SnapshotCache() uint64 {
return atomic.LoadUint64(&ss.numSnapshotCache)
}

// IncrPersister will increment persister counter
func (ss *stateStatistics) IncrPersister(epoch uint32) {
ss.mutPersisters.Lock()
defer ss.mutPersisters.Unlock()

ss.numPersister[epoch]++
}

// Persister returns the number of persister operations
func (ss *stateStatistics) Persister(epoch uint32) uint64 {
ss.mutPersisters.RLock()
defer ss.mutPersisters.RUnlock()

return ss.numPersister[epoch]
}

// IncrSnapshotPersister will increment snapshot persister counter
func (ss *stateStatistics) IncrSnapshotPersister(epoch uint32) {
ss.mutPersisters.Lock()
defer ss.mutPersisters.Unlock()

ss.numSnapshotPersister[epoch]++
}

// SnapshotPersister returns the number of snapshot persister operations
func (ss *stateStatistics) SnapshotPersister(epoch uint32) uint64 {
ss.mutPersisters.RLock()
defer ss.mutPersisters.RUnlock()

return ss.numSnapshotPersister[epoch]
}

// IncrTrie will increment trie counter
func (ss *stateStatistics) IncrTrie() {
atomic.AddUint64(&ss.numTrie, 1)
}

// Trie returns the number of trie operations
func (ss *stateStatistics) Trie() uint64 {
return atomic.LoadUint64(&ss.numTrie)
}

// SnapshotStats returns collected snapshot statistics as string
func (ss *stateStatistics) SnapshotStats() []string {
stats := make([]string, 0)

stats = append(stats, fmt.Sprintf("snapshot cache op = %v", atomic.LoadUint64(&ss.numSnapshotCache)))

ss.mutPersisters.RLock()
defer ss.mutPersisters.RUnlock()

for epoch, counter := range ss.numSnapshotPersister {
stats = append(stats, fmt.Sprintf("snapshot persister epoch = %v op = %v", epoch, counter))
}

return stats
}

// ProcessingStats returns collected processing statistics as string
func (ss *stateStatistics) ProcessingStats() []string {
stats := make([]string, 0)

stats = append(stats, fmt.Sprintf("cache op = %v", atomic.LoadUint64(&ss.numCache)))

ss.mutPersisters.RLock()
defer ss.mutPersisters.RUnlock()

for epoch, counter := range ss.numPersister {
stats = append(stats, fmt.Sprintf("persister epoch = %v op = %v", epoch, counter))
}

stats = append(stats, fmt.Sprintf("trie op = %v", atomic.LoadUint64(&ss.numTrie)))

return stats
}

// IsInterfaceNil returns true if there is no value under the interface
func (ss *stateStatistics) IsInterfaceNil() bool {
return ss == nil
}