mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-01 14:47:38 +00:00
5b29be1f4d
This allows setting up data replication among failure domains if the replication factor is smaller than the number of failure domains. Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6054 See https://docs.victoriametrics.com/vmagent/#sharding-among-remote-storages
48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package remotewrite
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"testing"
|
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/prompbmarshal"
|
|
)
|
|
|
|
func TestGetLabelsHash_Distribution(t *testing.T) {
|
|
f := func(bucketsCount int) {
|
|
t.Helper()
|
|
|
|
// Distribute itemsCount hashes returned by getLabelsHash() across bucketsCount buckets.
|
|
itemsCount := 1_000 * bucketsCount
|
|
m := make([]int, bucketsCount)
|
|
var labels []prompbmarshal.Label
|
|
for i := 0; i < itemsCount; i++ {
|
|
labels = append(labels[:0], prompbmarshal.Label{
|
|
Name: "__name__",
|
|
Value: fmt.Sprintf("some_name_%d", i),
|
|
})
|
|
for j := 0; j < 10; j++ {
|
|
labels = append(labels, prompbmarshal.Label{
|
|
Name: fmt.Sprintf("label_%d", j),
|
|
Value: fmt.Sprintf("value_%d_%d", i, j),
|
|
})
|
|
}
|
|
h := getLabelsHash(labels)
|
|
m[h%uint64(bucketsCount)]++
|
|
}
|
|
|
|
// Verify that the distribution is even
|
|
expectedItemsPerBucket := itemsCount / bucketsCount
|
|
for _, n := range m {
|
|
if math.Abs(1-float64(n)/float64(expectedItemsPerBucket)) > 0.04 {
|
|
t.Fatalf("unexpected items in the bucket for %d buckets; got %d; want around %d", bucketsCount, n, expectedItemsPerBucket)
|
|
}
|
|
}
|
|
}
|
|
|
|
f(2)
|
|
f(3)
|
|
f(4)
|
|
f(5)
|
|
f(10)
|
|
}
|