573ce712f2
Currently we have large set of nodes that are already disqualified and we are not sending bloom filters to them. The issue is that we are still generating filters for them while garbage collection process. Even if we have only segment with one piece which was stored on this node. This consumes additional memory and processing powers. This change is changing logic behind `AllPieceCounts` (renamed to ActiveNodesPieceCounts) to return piece count for all nodes except disqualified one (even with piece count = 0). With this change we can modify GC observer to skip nodes that where not returned by ActiveNodesPieceCounts. Change-Id: Ic75159135abe535084d8aeee560bb801a4a03e17
140 lines
3.5 KiB
Go
140 lines
3.5 KiB
Go
// Copyright (C) 2019 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package overlay_test
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"storj.io/common/pb"
|
|
"storj.io/common/storj"
|
|
"storj.io/common/testcontext"
|
|
"storj.io/common/testrand"
|
|
"storj.io/storj/satellite"
|
|
"storj.io/storj/satellite/overlay"
|
|
"storj.io/storj/satellite/satellitedb/satellitedbtest"
|
|
)
|
|
|
|
func TestDB_PieceCounts(t *testing.T) {
|
|
satellitedbtest.Run(t, func(ctx *testcontext.Context, t *testing.T, db satellite.DB) {
|
|
overlaydb := db.OverlayCache()
|
|
|
|
expectedNodePieces := make(map[storj.NodeID]int64, 100)
|
|
|
|
for i := 0; i < 100; i++ {
|
|
expectedNodePieces[testrand.NodeID()] = int64(math.Pow10(i + 1))
|
|
}
|
|
|
|
var nodeToDisqualify storj.NodeID
|
|
|
|
i := 0
|
|
for nodeID := range expectedNodePieces {
|
|
addr := fmt.Sprintf("127.0.%d.0:8080", i)
|
|
lastNet := fmt.Sprintf("127.0.%d", i)
|
|
d := overlay.NodeCheckInInfo{
|
|
NodeID: nodeID,
|
|
Address: &pb.NodeAddress{Address: addr},
|
|
LastIPPort: addr,
|
|
LastNet: lastNet,
|
|
Version: &pb.NodeVersion{Version: "v1.0.0"},
|
|
IsUp: true,
|
|
}
|
|
err := overlaydb.UpdateCheckIn(ctx, d, time.Now().UTC(), overlay.NodeSelectionConfig{})
|
|
require.NoError(t, err)
|
|
i++
|
|
|
|
nodeToDisqualify = nodeID
|
|
}
|
|
|
|
// check that they are initialized to zero
|
|
initialCounts, err := overlaydb.ActiveNodesPieceCounts(ctx)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(expectedNodePieces), len(initialCounts))
|
|
for nodeID := range expectedNodePieces {
|
|
pieceCount, found := initialCounts[nodeID]
|
|
require.True(t, found)
|
|
require.Zero(t, pieceCount)
|
|
}
|
|
|
|
err = overlaydb.UpdatePieceCounts(ctx, expectedNodePieces)
|
|
require.NoError(t, err)
|
|
|
|
// fetch new counts
|
|
updatedCounts, err := overlaydb.ActiveNodesPieceCounts(ctx)
|
|
require.NoError(t, err)
|
|
|
|
// verify values
|
|
for nodeID, pieceCount := range expectedNodePieces {
|
|
count, ok := updatedCounts[nodeID]
|
|
require.True(t, ok)
|
|
require.Equal(t, pieceCount, count)
|
|
}
|
|
|
|
// disqualify one node so it won't be returned by ActiveNodesPieceCounts
|
|
_, err = overlaydb.DisqualifyNode(ctx, nodeToDisqualify, time.Now(), overlay.DisqualificationReasonAuditFailure)
|
|
require.NoError(t, err)
|
|
|
|
pieceCounts, err := overlaydb.ActiveNodesPieceCounts(ctx)
|
|
require.NoError(t, err)
|
|
require.NotContains(t, pieceCounts, nodeToDisqualify)
|
|
})
|
|
}
|
|
|
|
func BenchmarkDB_PieceCounts(b *testing.B) {
|
|
satellitedbtest.Bench(b, func(b *testing.B, db satellite.DB) {
|
|
ctx := testcontext.New(b)
|
|
defer ctx.Cleanup()
|
|
|
|
var NumberOfNodes = 10000
|
|
if testing.Short() {
|
|
NumberOfNodes = 1000
|
|
}
|
|
|
|
overlaydb := db.OverlayCache()
|
|
|
|
counts := make(map[storj.NodeID]int64)
|
|
for i := 0; i < NumberOfNodes; i++ {
|
|
counts[testrand.NodeID()] = testrand.Int63n(100000)
|
|
}
|
|
|
|
var i int
|
|
for nodeID := range counts {
|
|
addr := fmt.Sprintf("127.0.%d.0:8080", i)
|
|
lastNet := fmt.Sprintf("127.0.%d", i)
|
|
i++
|
|
d := overlay.NodeCheckInInfo{
|
|
NodeID: nodeID,
|
|
Address: &pb.NodeAddress{Address: addr},
|
|
LastIPPort: addr,
|
|
LastNet: lastNet,
|
|
Version: &pb.NodeVersion{Version: "v1.0.0"},
|
|
}
|
|
err := overlaydb.UpdateCheckIn(ctx, d, time.Now().UTC(), overlay.NodeSelectionConfig{})
|
|
require.NoError(b, err)
|
|
}
|
|
|
|
b.Run("Update", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
err := overlaydb.UpdatePieceCounts(ctx, counts)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
}
|
|
})
|
|
|
|
b.Run("All", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_, err := overlaydb.ActiveNodesPieceCounts(ctx)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
}
|
|
})
|
|
})
|
|
}
|