2019-05-19 16:10:46 +01:00
|
|
|
// Copyright (C) 2019 Storj Labs, Inc.
|
|
|
|
// See LICENSE for copying information.
|
|
|
|
|
|
|
|
package overlay_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"math/rand"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/golang/protobuf/ptypes"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
|
|
|
"storj.io/storj/pkg/overlay"
|
|
|
|
"storj.io/storj/pkg/pb"
|
|
|
|
"storj.io/storj/pkg/storj"
|
|
|
|
"storj.io/storj/satellite"
|
|
|
|
"storj.io/storj/satellite/satellitedb/satellitedbtest"
|
|
|
|
)
|
|
|
|
|
|
|
|
func BenchmarkOverlay(b *testing.B) {
|
|
|
|
satellitedbtest.Bench(b, func(b *testing.B, db satellite.DB) {
|
|
|
|
const (
|
|
|
|
TotalNodeCount = 211
|
|
|
|
OnlineCount = 90
|
|
|
|
OfflineCount = 10
|
|
|
|
)
|
|
|
|
|
|
|
|
overlaydb := db.OverlayCache()
|
|
|
|
ctx := context.Background()
|
|
|
|
|
|
|
|
var all []storj.NodeID
|
|
|
|
var check []storj.NodeID
|
|
|
|
for i := 0; i < TotalNodeCount; i++ {
|
|
|
|
var id storj.NodeID
|
|
|
|
_, _ = rand.Read(id[:]) // math/rand never returns error
|
|
|
|
all = append(all, id)
|
|
|
|
if i < OnlineCount {
|
|
|
|
check = append(check, id)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, id := range all {
|
|
|
|
err := overlaydb.UpdateAddress(ctx, &pb.Node{Id: id})
|
|
|
|
require.NoError(b, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// create random offline node ids to check
|
|
|
|
for i := 0; i < OfflineCount; i++ {
|
|
|
|
var id storj.NodeID
|
|
|
|
_, _ = rand.Read(id[:]) // math/rand never returns error
|
|
|
|
check = append(check, id)
|
|
|
|
}
|
|
|
|
|
|
|
|
b.Run("KnownUnreliableOrOffline", func(b *testing.B) {
|
|
|
|
criteria := &overlay.NodeCriteria{
|
2019-06-18 18:40:28 +01:00
|
|
|
AuditCount: 0,
|
|
|
|
OnlineWindow: 1000 * time.Hour,
|
|
|
|
UptimeCount: 0,
|
2019-05-19 16:10:46 +01:00
|
|
|
}
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
badNodes, err := overlaydb.KnownUnreliableOrOffline(ctx, criteria, check)
|
|
|
|
require.NoError(b, err)
|
|
|
|
require.Len(b, badNodes, OfflineCount)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
b.Run("UpdateAddress", func(b *testing.B) {
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
id := all[i%len(all)]
|
|
|
|
err := overlaydb.UpdateAddress(ctx, &pb.Node{Id: id})
|
|
|
|
require.NoError(b, err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
b.Run("UpdateStats", func(b *testing.B) {
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
id := all[i%len(all)]
|
|
|
|
_, err := overlaydb.UpdateStats(ctx, &overlay.UpdateRequest{
|
|
|
|
NodeID: id,
|
|
|
|
AuditSuccess: i&1 == 0,
|
|
|
|
IsUp: i&2 == 0,
|
|
|
|
})
|
|
|
|
require.NoError(b, err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
b.Run("UpdateNodeInfo", func(b *testing.B) {
|
|
|
|
now := ptypes.TimestampNow()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
id := all[i%len(all)]
|
|
|
|
_, err := overlaydb.UpdateNodeInfo(ctx, id, &pb.InfoResponse{
|
|
|
|
Type: pb.NodeType_STORAGE,
|
|
|
|
Operator: &pb.NodeOperator{
|
|
|
|
Wallet: "0x0123456789012345678901234567890123456789",
|
2019-06-18 01:28:40 +01:00
|
|
|
Email: "a@mail.test",
|
2019-05-19 16:10:46 +01:00
|
|
|
},
|
|
|
|
Capacity: &pb.NodeCapacity{
|
|
|
|
FreeBandwidth: 1000,
|
|
|
|
FreeDisk: 1000,
|
|
|
|
},
|
|
|
|
Version: &pb.NodeVersion{
|
|
|
|
Version: "1.0.0",
|
|
|
|
CommitHash: "0",
|
|
|
|
Timestamp: now,
|
|
|
|
Release: false,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
require.NoError(b, err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
b.Run("UpdateUptime", func(b *testing.B) {
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
id := all[i%len(all)]
|
|
|
|
_, err := overlaydb.UpdateUptime(ctx, id, i&1 == 0)
|
|
|
|
require.NoError(b, err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|