mirror of
https://github.com/QuilibriumNetwork/ceremonyclient.git
synced 2026-02-21 10:27:26 +08:00
dependencies upgrade
This commit is contained in:
parent
ea1cc59e95
commit
2435e9216f
@ -7,6 +7,7 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
rand "math/rand/v2"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
@ -14,7 +15,6 @@ import (
|
||||
"github.com/cockroachdb/pebble"
|
||||
"github.com/cockroachdb/pebble/internal/randvar"
|
||||
"github.com/spf13/cobra"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
var queueConfig struct {
|
||||
@ -42,7 +42,7 @@ func queueTest() (test, *atomic.Int64) {
|
||||
init: func(d DB, wg *sync.WaitGroup) {
|
||||
var (
|
||||
value []byte
|
||||
rng = rand.New(rand.NewSource(1449168817))
|
||||
rng = rand.New(rand.NewPCG(0, 1449168817))
|
||||
queue = make([][]byte, queueConfig.size)
|
||||
)
|
||||
for i := 0; i < queueConfig.size; i++ {
|
||||
|
||||
@ -8,6 +8,7 @@ import (
|
||||
"fmt"
|
||||
"log"
|
||||
"math"
|
||||
rand "math/rand/v2"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
@ -15,7 +16,6 @@ import (
|
||||
"github.com/cockroachdb/pebble"
|
||||
"github.com/cockroachdb/pebble/internal/randvar"
|
||||
"github.com/spf13/cobra"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
var scanConfig struct {
|
||||
@ -65,7 +65,7 @@ func runScan(cmd *cobra.Command, args []string) {
|
||||
const count = 100000
|
||||
const batch = 1000
|
||||
|
||||
rng := rand.New(rand.NewSource(1449168817))
|
||||
rng := rand.New(rand.NewPCG(0, 1449168817))
|
||||
keys := make([][]byte, count)
|
||||
|
||||
for i := 0; i < count; {
|
||||
@ -94,7 +94,7 @@ func runScan(cmd *cobra.Command, args []string) {
|
||||
go func(i int) {
|
||||
defer wg.Done()
|
||||
|
||||
rng := rand.New(rand.NewSource(uint64(i)))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(i)))
|
||||
startKeyBuf := append(make([]byte, 0, 64), []byte("key-")...)
|
||||
endKeyBuf := append(make([]byte, 0, 64), []byte("key-")...)
|
||||
minTS := encodeUint64Ascending(nil, math.MaxUint64)
|
||||
@ -103,7 +103,7 @@ func runScan(cmd *cobra.Command, args []string) {
|
||||
wait(limiter)
|
||||
|
||||
rows := int(rowDist.Uint64(rng))
|
||||
startIdx := rng.Int31n(int32(len(keys) - rows))
|
||||
startIdx := rng.Int32N(int32(len(keys) - rows))
|
||||
startKey := encodeUint32Ascending(startKeyBuf[:4], uint32(startIdx))
|
||||
endKey := encodeUint32Ascending(endKeyBuf[:4], uint32(startIdx+int32(rows)))
|
||||
|
||||
|
||||
@ -7,6 +7,7 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
rand "math/rand/v2"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
@ -14,7 +15,6 @@ import (
|
||||
"github.com/cockroachdb/pebble"
|
||||
"github.com/cockroachdb/pebble/internal/randvar"
|
||||
"github.com/spf13/cobra"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
var syncConfig struct {
|
||||
@ -66,7 +66,7 @@ func runSync(cmd *cobra.Command, args []string) {
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
|
||||
rand := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rand := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
var raw []byte
|
||||
var buf []byte
|
||||
var block []byte
|
||||
|
||||
@ -67,9 +67,6 @@ func runTombstoneCmd(cmd *cobra.Command, args []string) error {
|
||||
|
||||
batchDist := ycsbConfig.batch
|
||||
scanDist := ycsbConfig.scans
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
valueDist := ycsbConfig.values
|
||||
y := newYcsb(weights, keyDist, batchDist, scanDist, valueDist)
|
||||
|
||||
@ -7,6 +7,7 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"math/rand/v2"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
@ -19,7 +20,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/internal/randvar"
|
||||
"github.com/cockroachdb/pebble/internal/rate"
|
||||
"github.com/spf13/cobra"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -225,9 +225,6 @@ func runYcsb(cmd *cobra.Command, args []string) error {
|
||||
|
||||
batchDist := ycsbConfig.batch
|
||||
scanDist := ycsbConfig.scans
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
valueDist := ycsbConfig.values
|
||||
y := newYcsb(weights, keyDist, batchDist, scanDist, valueDist)
|
||||
|
||||
@ -8,6 +8,7 @@ import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand/v2"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
@ -19,7 +20,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
type testCommitEnv struct {
|
||||
@ -331,7 +331,7 @@ func BenchmarkCommitPipeline(b *testing.B) {
|
||||
b.ResetTimer()
|
||||
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
buf := make([]byte, keySize)
|
||||
|
||||
for pb.Next() {
|
||||
|
||||
@ -9,6 +9,7 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand/v2"
|
||||
"path/filepath"
|
||||
"slices"
|
||||
"strconv"
|
||||
@ -25,7 +26,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/sstable"
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
// try repeatedly calls f, sleeping between calls with exponential back-off,
|
||||
@ -311,12 +311,12 @@ func TestRandomWrites(t *testing.T) {
|
||||
}
|
||||
xxx := bytes.Repeat([]byte("x"), 512)
|
||||
|
||||
rng := rand.New(rand.NewSource(123))
|
||||
rng := rand.New(rand.NewPCG(0, 123))
|
||||
const N = 1000
|
||||
for i := 0; i < N; i++ {
|
||||
k := rng.Intn(len(keys))
|
||||
if rng.Intn(20) != 0 {
|
||||
wants[k] = rng.Intn(len(xxx) + 1)
|
||||
k := rng.IntN(len(keys))
|
||||
if rng.IntN(20) != 0 {
|
||||
wants[k] = rng.IntN(len(xxx) + 1)
|
||||
if err := d.Set(keys[k], xxx[:wants[k]], nil); err != nil {
|
||||
t.Fatalf("i=%d: Set: %v", i, err)
|
||||
}
|
||||
@ -327,7 +327,7 @@ func TestRandomWrites(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
if i != N-1 || rng.Intn(50) != 0 {
|
||||
if i != N-1 || rng.IntN(50) != 0 {
|
||||
continue
|
||||
}
|
||||
for k := range keys {
|
||||
@ -930,7 +930,7 @@ func TestFlushEmpty(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRollManifest(t *testing.T) {
|
||||
toPreserve := rand.Int31n(5) + 1
|
||||
toPreserve := rand.Int32N(5) + 1
|
||||
opts := &Options{
|
||||
MaxManifestFileSize: 1,
|
||||
L0CompactionThreshold: 10,
|
||||
@ -1846,7 +1846,7 @@ func TestMemtableIngestInversion(t *testing.T) {
|
||||
}
|
||||
|
||||
func BenchmarkDelete(b *testing.B) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
const keyCount = 10000
|
||||
var keys [keyCount][]byte
|
||||
for i := 0; i < keyCount; i++ {
|
||||
|
||||
@ -8,6 +8,7 @@ import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"math"
|
||||
"math/rand/v2"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@ -21,7 +22,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/sstable"
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func TestExternalIterator(t *testing.T) {
|
||||
@ -151,13 +151,13 @@ func TestIterRandomizedMaybeFilteredKeys(t *testing.T) {
|
||||
seed = uint64(time.Now().UnixNano())
|
||||
t.Logf("seed: %d", seed)
|
||||
}
|
||||
rng := rand.New(rand.NewSource(seed))
|
||||
numKeys := 100 + rng.Intn(5000)
|
||||
rng := rand.New(rand.NewPCG(0, seed))
|
||||
numKeys := 100 + rng.IntN(5000)
|
||||
// The block property filter will exclude keys with suffixes [0, tsSeparator-1].
|
||||
// We use the first "part" of the keyspace below to write keys >= tsSeparator,
|
||||
// and the second part to write keys < tsSeparator. Successive parts (if any)
|
||||
// will contain keys at random before or after the separator.
|
||||
tsSeparator := 10 + rng.Int63n(5000)
|
||||
tsSeparator := 10 + rng.Int64N(5000)
|
||||
const keyLen = 5
|
||||
|
||||
// We split the keyspace into logical "parts" which are disjoint slices of the
|
||||
@ -166,8 +166,8 @@ func TestIterRandomizedMaybeFilteredKeys(t *testing.T) {
|
||||
// predictable clustering of timestamps in sstable blocks, however it is not
|
||||
// strictly necessary for this test.
|
||||
alpha := testkeys.Alpha(keyLen)
|
||||
numParts := rng.Intn(3) + 2
|
||||
blockSize := 16 + rng.Intn(64)
|
||||
numParts := rng.IntN(3) + 2
|
||||
blockSize := 16 + rng.IntN(64)
|
||||
|
||||
c := cache.New(128 << 20)
|
||||
defer c.Unref()
|
||||
@ -207,11 +207,11 @@ func TestIterRandomizedMaybeFilteredKeys(t *testing.T) {
|
||||
for j := 0; j < maxKeysPerPart; j++ {
|
||||
var ts int64
|
||||
if i == 0 {
|
||||
ts = rng.Int63n(5000) + tsSeparator
|
||||
ts = rng.Int64N(5000) + tsSeparator
|
||||
} else if i == 1 {
|
||||
ts = rng.Int63n(tsSeparator)
|
||||
ts = rng.Int64N(tsSeparator)
|
||||
} else {
|
||||
ts = rng.Int63n(tsSeparator + 5000)
|
||||
ts = rng.Int64N(tsSeparator + 5000)
|
||||
}
|
||||
n := testkeys.WriteKeyAt(buf, alpha, keyIdx*alpha.Count()/int64(numKeys), ts)
|
||||
keys = append(keys, append([]byte(nil), buf[:n]...))
|
||||
@ -251,7 +251,7 @@ func TestIterRandomizedMaybeFilteredKeys(t *testing.T) {
|
||||
narrowBoundsMode := false
|
||||
|
||||
for i := 0; i < 10000; i++ {
|
||||
if rng.Intn(8) == 0 {
|
||||
if rng.IntN(8) == 0 {
|
||||
// Toggle narrow bounds mode.
|
||||
if narrowBoundsMode {
|
||||
// Reset bounds.
|
||||
@ -260,7 +260,7 @@ func TestIterRandomizedMaybeFilteredKeys(t *testing.T) {
|
||||
}
|
||||
narrowBoundsMode = !narrowBoundsMode
|
||||
}
|
||||
keyIdx := rng.Intn(len(keys))
|
||||
keyIdx := rng.IntN(len(keys))
|
||||
seekKey := keys[keyIdx]
|
||||
if narrowBoundsMode {
|
||||
// Case 1: We just entered narrow bounds mode, and both bounds
|
||||
|
||||
@ -1,49 +1,50 @@
|
||||
module github.com/cockroachdb/pebble
|
||||
|
||||
replace github.com/cockroachdb/pebble => ../pebble
|
||||
|
||||
require (
|
||||
github.com/DataDog/zstd v1.4.5
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.2
|
||||
github.com/cespare/xxhash/v2 v2.2.0
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.2.0
|
||||
github.com/cespare/xxhash/v2 v2.3.0
|
||||
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f
|
||||
github.com/cockroachdb/errors v1.11.1
|
||||
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895
|
||||
github.com/cockroachdb/redact v1.1.5
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06
|
||||
github.com/cockroachdb/errors v1.12.0
|
||||
github.com/cockroachdb/metamorphic v0.0.0-20231120015718-884f2746775a
|
||||
github.com/cockroachdb/redact v1.1.6
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb
|
||||
github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9
|
||||
github.com/golang/snappy v0.0.4
|
||||
github.com/guptarohit/asciigraph v0.5.5
|
||||
github.com/klauspost/compress v1.15.15
|
||||
github.com/golang/snappy v1.0.0
|
||||
github.com/guptarohit/asciigraph v0.7.3
|
||||
github.com/klauspost/compress v1.18.1
|
||||
github.com/kr/pretty v0.3.1
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/pmezard/go-difflib v1.0.0
|
||||
github.com/prometheus/client_golang v1.12.0
|
||||
github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a
|
||||
github.com/spf13/cobra v1.0.0
|
||||
github.com/stretchr/testify v1.8.4
|
||||
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df
|
||||
golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4
|
||||
golang.org/x/sys v0.11.0
|
||||
github.com/prometheus/client_golang v1.23.2
|
||||
github.com/prometheus/client_model v0.6.2
|
||||
github.com/spf13/cobra v1.10.1
|
||||
github.com/stretchr/testify v1.11.1
|
||||
golang.org/x/perf v0.0.0-20251112180420-cfbd823f7301
|
||||
golang.org/x/sync v0.18.0
|
||||
golang.org/x/sys v0.38.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794 // indirect
|
||||
github.com/aclements/go-moremath v0.0.0-20241023150245-c8bbc672ef66 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
|
||||
github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/getsentry/sentry-go v0.18.0 // indirect
|
||||
github.com/getsentry/sentry-go v0.38.0 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang/protobuf v1.5.2 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||
github.com/kr/text v0.2.0 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
|
||||
github.com/prometheus/common v0.32.1 // indirect
|
||||
github.com/prometheus/procfs v0.7.3 // indirect
|
||||
github.com/rogpeppe/go-internal v1.9.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
golang.org/x/text v0.7.0 // indirect
|
||||
google.golang.org/protobuf v1.28.1 // indirect
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||
github.com/prometheus/common v0.67.4 // indirect
|
||||
github.com/prometheus/procfs v0.19.2 // indirect
|
||||
github.com/rogpeppe/go-internal v1.14.1 // indirect
|
||||
github.com/spf13/pflag v1.0.10 // indirect
|
||||
go.yaml.in/yaml/v2 v2.4.3 // indirect
|
||||
golang.org/x/text v0.31.0 // indirect
|
||||
google.golang.org/protobuf v1.36.10 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
||||
go 1.21
|
||||
go 1.24.0
|
||||
|
||||
670
pebble/go.sum
670
pebble/go.sum
@ -1,666 +1,126 @@
|
||||
cloud.google.com/go v0.0.0-20170206221025-ce650573d812/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
||||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
||||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
||||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
||||
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
|
||||
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
|
||||
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
|
||||
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
|
||||
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
|
||||
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
|
||||
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
|
||||
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
||||
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
||||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
|
||||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
||||
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
|
||||
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
|
||||
github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
|
||||
github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes=
|
||||
github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794 h1:xlwdaKcTNVW4PtpQb8aKA4Pjy0CdJHEqvFbAnvR5m2g=
|
||||
github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY=
|
||||
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
|
||||
github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.2.0 h1:XMJkDWuz6bM9Fzy7zORuVFKH7ZJY41G2q8KWhVGkNiY=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.2.0/go.mod h1:CiIeGiHSd06zjX+FypuEJ5EQ07KKtxZ+8J6hszwVQig=
|
||||
github.com/aclements/go-moremath v0.0.0-20241023150245-c8bbc672ef66 h1:siNQlUMcFUDZWCOt0p+RHl7et5Nnwwyq/sFZmr4iG1I=
|
||||
github.com/aclements/go-moremath v0.0.0-20241023150245-c8bbc672ef66/go.mod h1:FDw7qicTbJ1y1SZcNnOvym2BogPdC3lY9Z1iUM4MVhw=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
||||
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4=
|
||||
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU=
|
||||
github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8=
|
||||
github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw=
|
||||
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
|
||||
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
|
||||
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA=
|
||||
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA=
|
||||
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
|
||||
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
|
||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/cockroachdb/errors v1.12.0 h1:d7oCs6vuIMUQRVbi6jWWWEJZahLCfJpnJSVobd1/sUo=
|
||||
github.com/cockroachdb/errors v1.12.0/go.mod h1:SvzfYNNBshAVbZ8wzNc/UPK3w1vf0dKDUP41ucAIf7g=
|
||||
github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 h1:ASDL+UJcILMqgNeV5jiqR4j+sTuvQNHdf2chuKj1M5k=
|
||||
github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506/go.mod h1:Mw7HqKr2kdtu6aYGn3tPmAftiP3QPX63LdK/zcariIo=
|
||||
github.com/cockroachdb/metamorphic v0.0.0-20231120015718-884f2746775a h1:01C90sgy3XTHo67HJR2wsu0p3lp9/2VjqdEve5USE6Y=
|
||||
github.com/cockroachdb/metamorphic v0.0.0-20231120015718-884f2746775a/go.mod h1:GkaZ6eP1TNDIRtMFQoSCtUr0GoKSbTjN5bsKEL+7iB8=
|
||||
github.com/cockroachdb/redact v1.1.6 h1:zXJBwDZ84xJNlHl1rMyCojqyIxv+7YUpQiJLQ7n4314=
|
||||
github.com/cockroachdb/redact v1.1.6/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb h1:3bCgBvB8PbJVMX1ouCcSIxvsqKPYM7gs72o0zC76n9g=
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0=
|
||||
github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ=
|
||||
github.com/getsentry/sentry-go v0.38.0 h1:S8Xui7gLeAvXINVLMOaX94HnsDf1GexnfXGSNC4+KQs=
|
||||
github.com/getsentry/sentry-go v0.38.0/go.mod h1:eRXCoh3uvmjQLY6qu63BjUZnaBu5L5WhMV1RwYO8W5s=
|
||||
github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM=
|
||||
github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
|
||||
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
|
||||
github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=
|
||||
github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=
|
||||
github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
|
||||
github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
|
||||
github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=
|
||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
||||
github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=
|
||||
github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||
github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
|
||||
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc=
|
||||
github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg=
|
||||
github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks=
|
||||
github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A=
|
||||
github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU=
|
||||
github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/guptarohit/asciigraph v0.5.5 h1:ccFnUF8xYIOUPPY3tmdvRyHqmn1MYI9iv1pLKX+/ZkQ=
|
||||
github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||
github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
||||
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||
github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
|
||||
github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/guptarohit/asciigraph v0.7.3 h1:p05XDDn7cBTWiBqWb30mrwxd6oU0claAjqeytllnsPY=
|
||||
github.com/guptarohit/asciigraph v0.7.3/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag=
|
||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
|
||||
github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co=
|
||||
github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=
|
||||
github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
|
||||
github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
|
||||
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
|
||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
||||
github.com/prometheus/client_golang v1.12.0 h1:C+UIj/QWtmqY13Arb8kwMt5j34/0Z2iKamrJ+ryC0Gg=
|
||||
github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a h1:CmF68hwI0XsOQ5UwlBopMi2Ow4Pbg32akc4KIVCOm+Y=
|
||||
github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
|
||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
||||
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
|
||||
github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
|
||||
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
|
||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
|
||||
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
||||
github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
|
||||
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
|
||||
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
|
||||
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
|
||||
github.com/prometheus/common v0.67.4 h1:yR3NqWO1/UyO1w2PhUvXlGQs/PtFmoveVO0KZ4+Lvsc=
|
||||
github.com/prometheus/common v0.67.4/go.mod h1:gP0fq6YjjNCLssJCQp0yk4M8W6ikLURwkdd/YKtTbyI=
|
||||
github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws=
|
||||
github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw=
|
||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
|
||||
github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=
|
||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
|
||||
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
||||
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
|
||||
github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
|
||||
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
|
||||
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
|
||||
go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
||||
golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=
|
||||
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
||||
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME=
|
||||
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
||||
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
||||
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU=
|
||||
golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/perf v0.0.0-20251112180420-cfbd823f7301 h1:qKuLfh5O0Hw3QfGs43tKwsiqL8RV+034WMgSAGWW4js=
|
||||
golang.org/x/perf v0.0.0-20251112180420-cfbd823f7301/go.mod h1:CObWzdfY9ZrvLE+9Ps2aVQKgF18AM8T2lj7TxN/GIXw=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
|
||||
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
|
||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
||||
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
|
||||
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
||||
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
||||
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
|
||||
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
|
||||
gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
|
||||
gonum.org/v1/gonum v0.9.3 h1:DnoIG+QAMaF5NvxnGe/oKsgKcAc6PcUyl8q0VetfQ8s=
|
||||
gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=
|
||||
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
|
||||
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
|
||||
gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=
|
||||
gonum.org/v1/plot v0.10.0/go.mod h1:JWIHJ7U20drSQb/aDpTetJzfC1KlAPldJLpkSy88dvQ=
|
||||
google.golang.org/api v0.0.0-20170206182103-3d017632ea10/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
||||
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
||||
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
|
||||
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
||||
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/grpc v0.0.0-20170208002647-2a6bf6142e96/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
|
||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
||||
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
|
||||
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
|
||||
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
|
||||
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||
|
||||
@ -1252,9 +1252,6 @@ func (d *DB) handleIngestAsFlushable(meta []*fileMetadata, seqNum uint64) error
|
||||
// ingestedFlushable in the flushable queue. The mutable memtable
|
||||
// will be created below.
|
||||
newLogNum, _ = d.recycleWAL()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
currMem := d.mu.mem.mutable
|
||||
|
||||
@ -10,6 +10,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"math/rand/v2"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"slices"
|
||||
@ -38,7 +39,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/vfs/errorfs"
|
||||
"github.com/kr/pretty"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func TestSSTableKeyCompare(t *testing.T) {
|
||||
@ -147,7 +147,7 @@ func TestIngestLoad(t *testing.T) {
|
||||
|
||||
func TestIngestLoadRand(t *testing.T) {
|
||||
mem := vfs.NewMem()
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
cmp := DefaultComparer.Compare
|
||||
version := internalFormatNewest
|
||||
|
||||
@ -159,7 +159,7 @@ func TestIngestLoadRand(t *testing.T) {
|
||||
return data
|
||||
}
|
||||
|
||||
paths := make([]string, 1+rng.Intn(10))
|
||||
paths := make([]string, 1+rng.IntN(10))
|
||||
pending := make([]base.DiskFileNum, len(paths))
|
||||
expected := make([]*fileMetadata, len(paths))
|
||||
for i := range paths {
|
||||
@ -174,10 +174,10 @@ func TestIngestLoadRand(t *testing.T) {
|
||||
f, err := mem.Create(paths[i])
|
||||
require.NoError(t, err)
|
||||
|
||||
keys := make([]InternalKey, 1+rng.Intn(100))
|
||||
keys := make([]InternalKey, 1+rng.IntN(100))
|
||||
for i := range keys {
|
||||
keys[i] = base.MakeInternalKey(
|
||||
randBytes(1+rng.Intn(10)),
|
||||
randBytes(1+rng.IntN(10)),
|
||||
0,
|
||||
InternalKeyKindSet)
|
||||
}
|
||||
@ -3217,7 +3217,7 @@ func TestIngestValidation(t *testing.T) {
|
||||
)
|
||||
|
||||
seed := uint64(time.Now().UnixNano())
|
||||
rng := rand.New(rand.NewSource(seed))
|
||||
rng := rand.New(rand.NewPCG(0, seed))
|
||||
t.Logf("rng seed = %d", seed)
|
||||
|
||||
// errfsCounter is used by test cases that make use of an errorfs.Injector
|
||||
@ -3328,7 +3328,7 @@ func TestIngestValidation(t *testing.T) {
|
||||
case corruptionLocationEnd:
|
||||
blockIdx = len(l.Data) - 1
|
||||
case corruptionLocationInternal:
|
||||
blockIdx = 1 + rng.Intn(len(l.Data)-2)
|
||||
blockIdx = 1 + rng.IntN(len(l.Data)-2)
|
||||
default:
|
||||
t.Fatalf("unknown corruptionLocation: %T", tc.cLoc)
|
||||
}
|
||||
@ -3395,12 +3395,14 @@ func TestIngestValidation(t *testing.T) {
|
||||
var keyVals []keyVal
|
||||
for i := 0; i < nKeys; i++ {
|
||||
key := make([]byte, keySize)
|
||||
_, err = rng.Read(key)
|
||||
require.NoError(t, err)
|
||||
for j := range key {
|
||||
key[j] = byte(rng.Uint32())
|
||||
}
|
||||
|
||||
val := make([]byte, valSize)
|
||||
_, err = rng.Read(val)
|
||||
require.NoError(t, err)
|
||||
for j := range val {
|
||||
val[j] = byte(rng.Uint32())
|
||||
}
|
||||
|
||||
keyVals = append(keyVals, keyVal{key, val})
|
||||
}
|
||||
|
||||
@ -21,6 +21,7 @@ import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"strconv"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
@ -29,7 +30,6 @@ import (
|
||||
|
||||
"github.com/cockroachdb/pebble/internal/base"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
const arenaSize = 1 << 20
|
||||
@ -819,7 +819,7 @@ func BenchmarkReadWrite(b *testing.B) {
|
||||
var count int
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
it := l.NewIter(nil, nil)
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
buf := make([]byte, 8)
|
||||
|
||||
for pb.Next() {
|
||||
@ -857,7 +857,7 @@ func BenchmarkOrderedWrite(b *testing.B) {
|
||||
|
||||
func BenchmarkIterNext(b *testing.B) {
|
||||
l := NewSkiplist(newArena(64<<10), bytes.Compare)
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
buf := make([]byte, 8)
|
||||
for {
|
||||
if err := l.Add(randomKey(rng, buf), nil); err == ErrArenaFull {
|
||||
@ -878,7 +878,7 @@ func BenchmarkIterNext(b *testing.B) {
|
||||
|
||||
func BenchmarkIterPrev(b *testing.B) {
|
||||
l := NewSkiplist(newArena(64<<10), bytes.Compare)
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
buf := make([]byte, 8)
|
||||
for {
|
||||
if err := l.Add(randomKey(rng, buf), nil); err == ErrArenaFull {
|
||||
@ -951,7 +951,7 @@ func BenchmarkSeekPrefixGE(b *testing.B) {
|
||||
// b.ResetTimer()
|
||||
// var count int
|
||||
// b.RunParallel(func(pb *testing.PB) {
|
||||
// rng := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
// rng := rand.New(rand.NewPCG(0,time.Now().UnixNano()))
|
||||
// for pb.Next() {
|
||||
// if rng.Float32() < readFrac {
|
||||
// mutex.RLock()
|
||||
|
||||
@ -6,11 +6,10 @@ package base
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"slices"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func TestDefAppendSeparator(t *testing.T) {
|
||||
@ -56,7 +55,7 @@ func TestDefAppendSeparator(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestAbbreviatedKey(t *testing.T) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
randBytes := func(size int) []byte {
|
||||
data := make([]byte, size)
|
||||
for i := range data {
|
||||
@ -67,7 +66,7 @@ func TestAbbreviatedKey(t *testing.T) {
|
||||
|
||||
keys := make([][]byte, 10000)
|
||||
for i := range keys {
|
||||
keys[i] = randBytes(rng.Intn(16))
|
||||
keys[i] = randBytes(rng.IntN(16))
|
||||
}
|
||||
slices.SortFunc(keys, DefaultComparer.Compare)
|
||||
|
||||
@ -90,7 +89,7 @@ func TestAbbreviatedKey(t *testing.T) {
|
||||
}
|
||||
|
||||
func BenchmarkAbbreviatedKey(b *testing.B) {
|
||||
rng := rand.New(rand.NewSource(1449168817))
|
||||
rng := rand.New(rand.NewPCG(0, 1449168817))
|
||||
randBytes := func(size int) []byte {
|
||||
data := make([]byte, size)
|
||||
for i := range data {
|
||||
|
||||
@ -58,13 +58,12 @@ import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"math"
|
||||
"time"
|
||||
"math/rand/v2"
|
||||
"unsafe"
|
||||
|
||||
"github.com/cockroachdb/errors"
|
||||
"github.com/cockroachdb/pebble/internal/base"
|
||||
"github.com/cockroachdb/pebble/internal/constants"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -125,7 +124,7 @@ type Skiplist struct {
|
||||
head uint32
|
||||
tail uint32
|
||||
height uint32 // Current height: 1 <= height <= maxHeight
|
||||
rand rand.PCGSource
|
||||
rand rand.PCG
|
||||
}
|
||||
|
||||
var (
|
||||
@ -173,7 +172,7 @@ func (s *Skiplist) Init(storage *[]byte, cmp base.Compare, abbreviatedKey base.A
|
||||
nodes: s.nodes[:0],
|
||||
height: 1,
|
||||
}
|
||||
s.rand.Seed(uint64(time.Now().UnixNano()))
|
||||
s.rand.Seed(0, rand.Uint64())
|
||||
|
||||
const initBufSize = 256
|
||||
if cap(s.nodes) < initBufSize {
|
||||
|
||||
@ -21,13 +21,13 @@ import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/cockroachdb/errors"
|
||||
"github.com/cockroachdb/pebble/internal/base"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
// iterAdapter adapts the new Iterator API which returns the key and value from
|
||||
@ -456,7 +456,7 @@ func BenchmarkReadWrite(b *testing.B) {
|
||||
}
|
||||
l := newTestSkiplist(d)
|
||||
it := l.NewIter(nil, nil)
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
@ -495,7 +495,7 @@ func BenchmarkIterNext(b *testing.B) {
|
||||
}
|
||||
l := newTestSkiplist(d)
|
||||
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
for len(d.data)+20 < cap(d.data) {
|
||||
key := randomKey(rng, buf[:])
|
||||
offset := d.addBytes(key)
|
||||
@ -520,7 +520,7 @@ func BenchmarkIterPrev(b *testing.B) {
|
||||
}
|
||||
l := newTestSkiplist(d)
|
||||
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
for len(d.data)+20 < cap(d.data) {
|
||||
key := randomKey(rng, buf[:])
|
||||
offset := d.addBytes(key)
|
||||
|
||||
6
pebble/internal/cache/clockpro_test.go
vendored
6
pebble/internal/cache/clockpro_test.go
vendored
@ -7,6 +7,7 @@ import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"os"
|
||||
"runtime"
|
||||
"strconv"
|
||||
@ -16,7 +17,6 @@ import (
|
||||
|
||||
"github.com/cockroachdb/pebble/internal/base"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func TestCache(t *testing.T) {
|
||||
@ -238,10 +238,10 @@ func BenchmarkCacheGet(b *testing.B) {
|
||||
|
||||
b.ResetTimer()
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
for pb.Next() {
|
||||
h := cache.Get(1, base.FileNum(0).DiskFileNum(), uint64(rng.Intn(size)))
|
||||
h := cache.Get(1, base.FileNum(0).DiskFileNum(), uint64(rng.IntN(size)))
|
||||
if h.Get() == nil {
|
||||
b.Fatal("failed to lookup value")
|
||||
}
|
||||
|
||||
44
pebble/internal/cache/robin_hood_test.go
vendored
44
pebble/internal/cache/robin_hood_test.go
vendored
@ -7,23 +7,23 @@ package cache
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand/v2"
|
||||
"runtime"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/cockroachdb/pebble/internal/base"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func TestRobinHoodMap(t *testing.T) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
rhMap := newRobinHoodMap(0)
|
||||
defer rhMap.free()
|
||||
|
||||
goMap := make(map[key]*entry)
|
||||
|
||||
randomKey := func() key {
|
||||
n := rng.Intn(len(goMap))
|
||||
n := rng.IntN(len(goMap))
|
||||
for k := range goMap {
|
||||
if n == 0 {
|
||||
return k
|
||||
@ -33,7 +33,7 @@ func TestRobinHoodMap(t *testing.T) {
|
||||
return key{}
|
||||
}
|
||||
|
||||
ops := 10000 + rng.Intn(10000)
|
||||
ops := 10000 + rng.IntN(10000)
|
||||
for i := 0; i < ops; i++ {
|
||||
var which float64
|
||||
if len(goMap) > 0 {
|
||||
@ -90,11 +90,11 @@ func TestRobinHoodMap(t *testing.T) {
|
||||
const benchSize = 1 << 20
|
||||
|
||||
func BenchmarkGoMapInsert(b *testing.B) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
keys := make([]key, benchSize)
|
||||
for i := range keys {
|
||||
keys[i].fileNum = base.FileNum(rng.Uint64n(1 << 20)).DiskFileNum()
|
||||
keys[i].offset = uint64(rng.Intn(1 << 20))
|
||||
keys[i].fileNum = base.FileNum(rng.Uint64N(1 << 20)).DiskFileNum()
|
||||
keys[i].offset = uint64(rng.IntN(1 << 20))
|
||||
}
|
||||
b.ResetTimer()
|
||||
|
||||
@ -111,11 +111,11 @@ func BenchmarkGoMapInsert(b *testing.B) {
|
||||
}
|
||||
|
||||
func BenchmarkRobinHoodInsert(b *testing.B) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
keys := make([]key, benchSize)
|
||||
for i := range keys {
|
||||
keys[i].fileNum = base.FileNum(rng.Uint64n(1 << 20)).DiskFileNum()
|
||||
keys[i].offset = uint64(rng.Intn(1 << 20))
|
||||
keys[i].fileNum = base.FileNum(rng.Uint64N(1 << 20)).DiskFileNum()
|
||||
keys[i].offset = uint64(rng.IntN(1 << 20))
|
||||
}
|
||||
e := &entry{}
|
||||
b.ResetTimer()
|
||||
@ -135,13 +135,13 @@ func BenchmarkRobinHoodInsert(b *testing.B) {
|
||||
}
|
||||
|
||||
func BenchmarkGoMapLookupHit(b *testing.B) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
keys := make([]key, benchSize)
|
||||
m := make(map[key]*entry, len(keys))
|
||||
e := &entry{}
|
||||
for i := range keys {
|
||||
keys[i].fileNum = base.FileNum(rng.Uint64n(1 << 20)).DiskFileNum()
|
||||
keys[i].offset = uint64(rng.Intn(1 << 20))
|
||||
keys[i].fileNum = base.FileNum(rng.Uint64N(1 << 20)).DiskFileNum()
|
||||
keys[i].offset = uint64(rng.IntN(1 << 20))
|
||||
m[keys[i]] = e
|
||||
}
|
||||
b.ResetTimer()
|
||||
@ -160,13 +160,13 @@ func BenchmarkGoMapLookupHit(b *testing.B) {
|
||||
}
|
||||
|
||||
func BenchmarkRobinHoodLookupHit(b *testing.B) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
keys := make([]key, benchSize)
|
||||
m := newRobinHoodMap(len(keys))
|
||||
e := &entry{}
|
||||
for i := range keys {
|
||||
keys[i].fileNum = base.FileNum(rng.Uint64n(1 << 20)).DiskFileNum()
|
||||
keys[i].offset = uint64(rng.Intn(1 << 20))
|
||||
keys[i].fileNum = base.FileNum(rng.Uint64N(1 << 20)).DiskFileNum()
|
||||
keys[i].offset = uint64(rng.IntN(1 << 20))
|
||||
m.Put(keys[i], e)
|
||||
}
|
||||
b.ResetTimer()
|
||||
@ -186,14 +186,14 @@ func BenchmarkRobinHoodLookupHit(b *testing.B) {
|
||||
}
|
||||
|
||||
func BenchmarkGoMapLookupMiss(b *testing.B) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
keys := make([]key, benchSize)
|
||||
m := make(map[key]*entry, len(keys))
|
||||
e := &entry{}
|
||||
for i := range keys {
|
||||
keys[i].id = 1
|
||||
keys[i].fileNum = base.FileNum(rng.Uint64n(1 << 20)).DiskFileNum()
|
||||
keys[i].offset = uint64(rng.Intn(1 << 20))
|
||||
keys[i].fileNum = base.FileNum(rng.Uint64N(1 << 20)).DiskFileNum()
|
||||
keys[i].offset = uint64(rng.IntN(1 << 20))
|
||||
m[keys[i]] = e
|
||||
keys[i].id = 2
|
||||
}
|
||||
@ -213,14 +213,14 @@ func BenchmarkGoMapLookupMiss(b *testing.B) {
|
||||
}
|
||||
|
||||
func BenchmarkRobinHoodLookupMiss(b *testing.B) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
keys := make([]key, benchSize)
|
||||
m := newRobinHoodMap(len(keys))
|
||||
e := &entry{}
|
||||
for i := range keys {
|
||||
keys[i].id = 1
|
||||
keys[i].fileNum = base.FileNum(rng.Uint64n(1 << 20)).DiskFileNum()
|
||||
keys[i].offset = uint64(rng.Intn(1 << 20))
|
||||
keys[i].fileNum = base.FileNum(rng.Uint64N(1 << 20)).DiskFileNum()
|
||||
keys[i].offset = uint64(rng.IntN(1 << 20))
|
||||
m.Put(keys[i], e)
|
||||
keys[i].id = 2
|
||||
}
|
||||
|
||||
@ -6,21 +6,20 @@ package fastrand
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
type defaultRand struct {
|
||||
mu sync.Mutex
|
||||
src rand.PCGSource
|
||||
src rand.PCG
|
||||
}
|
||||
|
||||
func newDefaultRand() *defaultRand {
|
||||
r := &defaultRand{}
|
||||
r.src.Seed(uint64(time.Now().UnixNano()))
|
||||
r.src.Seed(0, uint64(time.Now().UnixNano()))
|
||||
return r
|
||||
}
|
||||
|
||||
@ -70,15 +69,15 @@ func BenchmarkSTDefaultRand(b *testing.B) {
|
||||
name = fmt.Sprintf("new-period=%d", newPeriod)
|
||||
}
|
||||
b.Run(name, func(b *testing.B) {
|
||||
r := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
r := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
b.ResetTimer()
|
||||
var x uint32
|
||||
for i := 0; i < b.N; i++ {
|
||||
if newPeriod > 0 && i%newPeriod == 0 {
|
||||
r = rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
r = rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
}
|
||||
// Arbitrary constant.
|
||||
x = uint32(r.Uint64n(2097152))
|
||||
x = uint32(r.Uint64N(2097152))
|
||||
}
|
||||
xg = x
|
||||
})
|
||||
|
||||
@ -22,9 +22,9 @@ import (
|
||||
|
||||
const (
|
||||
cmdGo = "go"
|
||||
golint = "golang.org/x/lint/golint@6edffad5e6160f5949cdefc81710b2706fbcd4f6"
|
||||
staticcheck = "honnef.co/go/tools/cmd/staticcheck@2023.1"
|
||||
crlfmt = "github.com/cockroachdb/crlfmt@44a36ec7"
|
||||
golint = "golang.org/x/lint/golint"
|
||||
staticcheck = "honnef.co/go/tools/cmd/staticcheck"
|
||||
crlfmt = "github.com/cockroachdb/crlfmt"
|
||||
)
|
||||
|
||||
func dirCmd(t *testing.T, dir string, name string, args ...string) stream.Filter {
|
||||
@ -45,6 +45,23 @@ func ignoreGoMod() stream.Filter {
|
||||
return stream.GrepNot(`^go: (finding|extracting|downloading)`)
|
||||
}
|
||||
|
||||
func getTool(t *testing.T, path string) {
|
||||
cmd := exec.Command("go", "get", path)
|
||||
out, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
t.Fatalf("cannot get %q: %v\n%s\n", path, err, out)
|
||||
}
|
||||
}
|
||||
|
||||
func installTool(t *testing.T, path string) {
|
||||
getTool(t, path)
|
||||
cmd := exec.Command("go", "install", path)
|
||||
out, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
t.Fatalf("cannot install %q: %v\n%s\n", path, err, out)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLint(t *testing.T) {
|
||||
if runtime.GOOS == "windows" {
|
||||
t.Skip("lint checks skipped on Windows")
|
||||
@ -54,7 +71,7 @@ func TestLint(t *testing.T) {
|
||||
t.Skip("lint checks skipped on race builds")
|
||||
}
|
||||
|
||||
const root = "github.com/cockroachdb/pebble"
|
||||
const root = "./"
|
||||
|
||||
pkg, err := build.Import(root, "../..", 0)
|
||||
require.NoError(t, err)
|
||||
@ -71,6 +88,7 @@ func TestLint(t *testing.T) {
|
||||
}
|
||||
|
||||
t.Run("TestGolint", func(t *testing.T) {
|
||||
installTool(t, golint)
|
||||
t.Parallel()
|
||||
|
||||
args := []string{"run", golint}
|
||||
@ -90,6 +108,7 @@ func TestLint(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("TestStaticcheck", func(t *testing.T) {
|
||||
installTool(t, staticcheck)
|
||||
t.Parallel()
|
||||
|
||||
args := []string{"run", staticcheck}
|
||||
@ -240,6 +259,7 @@ func TestLint(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("TestCrlfmt", func(t *testing.T) {
|
||||
installTool(t, crlfmt)
|
||||
t.Parallel()
|
||||
|
||||
args := []string{"run", crlfmt, "-fast", "-tab", "2", "."}
|
||||
|
||||
@ -9,6 +9,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"math/rand/v2"
|
||||
"os"
|
||||
"slices"
|
||||
"sort"
|
||||
@ -22,7 +23,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/internal/testkeys"
|
||||
"github.com/cockroachdb/pebble/record"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func readManifest(filename string) (*Version, error) {
|
||||
@ -497,7 +497,7 @@ func TestL0Sublevels(t *testing.T) {
|
||||
|
||||
func TestAddL0FilesEquivalence(t *testing.T) {
|
||||
seed := uint64(time.Now().UnixNano())
|
||||
rng := rand.New(rand.NewSource(seed))
|
||||
rng := rand.New(rand.NewPCG(0, seed))
|
||||
t.Logf("seed: %d", seed)
|
||||
|
||||
var inUseKeys [][]byte
|
||||
@ -506,19 +506,19 @@ func TestAddL0FilesEquivalence(t *testing.T) {
|
||||
var s, s2 *L0Sublevels
|
||||
keySpace := testkeys.Alpha(8)
|
||||
|
||||
flushSplitMaxBytes := rng.Int63n(1 << 20)
|
||||
flushSplitMaxBytes := rng.Int64N(1 << 20)
|
||||
|
||||
// The outer loop runs once for each version edit. The inner loop(s) run
|
||||
// once for each file, or each file bound.
|
||||
for i := 0; i < 100; i++ {
|
||||
var filesToAdd []*FileMetadata
|
||||
numFiles := 1 + rng.Intn(9)
|
||||
numFiles := 1 + rng.IntN(9)
|
||||
keys := make([][]byte, 0, 2*numFiles)
|
||||
for j := 0; j < 2*numFiles; j++ {
|
||||
if rng.Float64() <= keyReusePct && len(inUseKeys) > 0 {
|
||||
keys = append(keys, inUseKeys[rng.Intn(len(inUseKeys))])
|
||||
keys = append(keys, inUseKeys[rng.IntN(len(inUseKeys))])
|
||||
} else {
|
||||
newKey := testkeys.Key(keySpace, rng.Int63n(keySpace.Count()))
|
||||
newKey := testkeys.Key(keySpace, rng.Int64N(keySpace.Count()))
|
||||
inUseKeys = append(inUseKeys, newKey)
|
||||
keys = append(keys, newKey)
|
||||
}
|
||||
@ -532,7 +532,7 @@ func TestAddL0FilesEquivalence(t *testing.T) {
|
||||
}
|
||||
meta := (&FileMetadata{
|
||||
FileNum: base.FileNum(i*10 + j + 1),
|
||||
Size: rng.Uint64n(1 << 20),
|
||||
Size: rng.Uint64N(1 << 20),
|
||||
SmallestSeqNum: uint64(2*i + 1),
|
||||
LargestSeqNum: uint64(2*i + 2),
|
||||
}).ExtendPointKeyBounds(
|
||||
|
||||
@ -365,7 +365,7 @@ func (f *pebbleVersions) String() string {
|
||||
if i > 0 {
|
||||
fmt.Fprint(&buf, " ")
|
||||
}
|
||||
fmt.Fprintf(&buf, v.SHA)
|
||||
fmt.Fprintf(&buf, "%s", v.SHA)
|
||||
}
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
@ -7,13 +7,13 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"math/rand/v2"
|
||||
"os"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/cockroachdb/pebble/internal/rate"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -163,7 +163,7 @@ func newDB() *DB {
|
||||
|
||||
// drainCompaction simulates background compactions.
|
||||
func (db *DB) drainCompaction() {
|
||||
rng := rand.New(rand.NewSource(1))
|
||||
rng := rand.New(rand.NewPCG(0, 1))
|
||||
|
||||
for {
|
||||
db.compactionMu.Lock()
|
||||
@ -176,7 +176,7 @@ func (db *DB) drainCompaction() {
|
||||
|
||||
var delay bool
|
||||
for i, size := int64(0), int64(0); i < *l0Table; i += size {
|
||||
size = 10000 + rng.Int63n(500)
|
||||
size = 10000 + rng.Int64N(500)
|
||||
if size > (*l0Table - i) {
|
||||
size = *l0Table - i
|
||||
}
|
||||
@ -206,7 +206,7 @@ func (db *DB) drainCompaction() {
|
||||
for t := 0; t < tablesToCompact; t++ {
|
||||
db.compactionPacer.fill(memtableSize)
|
||||
for i, size := int64(0), int64(0); i < memtableSize; i += size {
|
||||
size = 10000 + rng.Int63n(500)
|
||||
size = 10000 + rng.Int64N(500)
|
||||
if size > (totalCompactionBytes - i) {
|
||||
size = totalCompactionBytes - i
|
||||
}
|
||||
@ -237,7 +237,7 @@ func (db *DB) fillCompaction(size int64) {
|
||||
|
||||
// drainMemtable simulates memtable flushing.
|
||||
func (db *DB) drainMemtable() {
|
||||
rng := rand.New(rand.NewSource(2))
|
||||
rng := rand.New(rand.NewPCG(0, 2))
|
||||
|
||||
for {
|
||||
db.mu.Lock()
|
||||
@ -249,7 +249,7 @@ func (db *DB) drainMemtable() {
|
||||
|
||||
var delay bool
|
||||
for i, size := int64(0), int64(0); i < *memtable; i += size {
|
||||
size = 1000 + rng.Int63n(50)
|
||||
size = 1000 + rng.Int64N(50)
|
||||
if size > (*memtable - i) {
|
||||
size = *memtable - i
|
||||
}
|
||||
@ -325,17 +325,17 @@ func simulateWrite(db *DB, measureLatencyMode bool) {
|
||||
|
||||
if !measureLatencyMode {
|
||||
go func() {
|
||||
rng := rand.New(rand.NewSource(3))
|
||||
rng := rand.New(rand.NewPCG(0, 3))
|
||||
for {
|
||||
secs := 5 + rng.Intn(5)
|
||||
secs := 5 + rng.IntN(5)
|
||||
time.Sleep(time.Duration(secs) * time.Second)
|
||||
mb := 10 + rng.Intn(20)
|
||||
mb := 10 + rng.IntN(20)
|
||||
setRate(mb)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
rng := rand.New(rand.NewSource(uint64(4)))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(4)))
|
||||
|
||||
totalWrites := int64(0)
|
||||
percentiles := []int64{50, 95, 99}
|
||||
@ -344,7 +344,7 @@ func simulateWrite(db *DB, measureLatencyMode bool) {
|
||||
|
||||
startTime := time.Now()
|
||||
for totalWrites <= writeAmount {
|
||||
size := 1000 + rng.Int63n(50)
|
||||
size := 1000 + rng.Int64N(50)
|
||||
if !measureLatencyMode {
|
||||
limiter.Wait(float64(size))
|
||||
}
|
||||
|
||||
@ -7,12 +7,12 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"math/rand/v2"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/cockroachdb/pebble/internal/rate"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -144,7 +144,7 @@ func newDB() *DB {
|
||||
|
||||
// drainCompaction simulates background compactions.
|
||||
func (db *DB) drainCompaction() {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
for {
|
||||
db.compactionMu.Lock()
|
||||
@ -156,7 +156,7 @@ func (db *DB) drainCompaction() {
|
||||
db.compactionMu.Unlock()
|
||||
|
||||
for i, size := int64(0), int64(0); i < *l0Table; i += size {
|
||||
size = 10000 + rng.Int63n(500)
|
||||
size = 10000 + rng.Int64N(500)
|
||||
if size > (*l0Table - i) {
|
||||
size = *l0Table - i
|
||||
}
|
||||
@ -186,7 +186,7 @@ func (db *DB) drainCompaction() {
|
||||
|
||||
for t := 0; t < tablesToCompact; t++ {
|
||||
for i, size := int64(0), int64(0); i < memtableSize; i += size {
|
||||
size = 10000 + rng.Int63n(500)
|
||||
size = 10000 + rng.Int64N(500)
|
||||
if size > (totalCompactionBytes - i) {
|
||||
size = totalCompactionBytes - i
|
||||
}
|
||||
@ -217,7 +217,7 @@ func (db *DB) fillCompaction(size int64) {
|
||||
|
||||
// drainMemtable simulates memtable flushing.
|
||||
func (db *DB) drainMemtable() {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
for {
|
||||
db.mu.Lock()
|
||||
@ -228,7 +228,7 @@ func (db *DB) drainMemtable() {
|
||||
db.mu.Unlock()
|
||||
|
||||
for i, size := int64(0), int64(0); i < *memtable; i += size {
|
||||
size = 1000 + rng.Int63n(50)
|
||||
size = 1000 + rng.Int64N(50)
|
||||
if size > (*memtable - i) {
|
||||
size = *memtable - i
|
||||
}
|
||||
@ -315,19 +315,19 @@ func simulateWrite(db *DB) {
|
||||
}
|
||||
|
||||
go func() {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
for {
|
||||
secs := 5 + rng.Intn(5)
|
||||
secs := 5 + rng.IntN(5)
|
||||
time.Sleep(time.Duration(secs) * time.Second)
|
||||
mb := 11 + rng.Intn(20)
|
||||
mb := 11 + rng.IntN(20)
|
||||
setRate(mb)
|
||||
}
|
||||
}()
|
||||
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
for {
|
||||
size := 1000 + rng.Int63n(50)
|
||||
size := 1000 + rng.Int64N(50)
|
||||
limiter.Wait(float64(size))
|
||||
db.writeLimiter.Wait(float64(size))
|
||||
db.fillMemtable(size)
|
||||
|
||||
@ -5,9 +5,8 @@
|
||||
package randvar
|
||||
|
||||
import (
|
||||
"math/rand/v2"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
// Deck is a random number generator that generates numbers in the range
|
||||
|
||||
@ -6,12 +6,13 @@ package randvar
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
// "math/rand/v2"
|
||||
rand "math/rand/v2"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/cockroachdb/errors"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
var randVarRE = regexp.MustCompile(`^(?:(latest|uniform|zipf):)?(\d+)(?:-(\d+))?$`)
|
||||
|
||||
@ -5,14 +5,13 @@
|
||||
package randvar
|
||||
|
||||
import (
|
||||
"math/rand/v2"
|
||||
"time"
|
||||
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
// NewRand creates a new random number generator seeded with the current time.
|
||||
func NewRand() *rand.Rand {
|
||||
return rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
return rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
}
|
||||
|
||||
func ensureRand(rng *rand.Rand) *rand.Rand {
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
package randvar
|
||||
|
||||
import "golang.org/x/exp/rand"
|
||||
import rand "math/rand/v2"
|
||||
|
||||
// Static models a random variable that pulls from a distribution with static
|
||||
// bounds
|
||||
|
||||
@ -16,9 +16,9 @@
|
||||
package randvar
|
||||
|
||||
import (
|
||||
// "math/rand/v2"
|
||||
rand "math/rand/v2"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
// SkewedLatest is a random number generator that generates numbers in
|
||||
|
||||
@ -16,9 +16,8 @@
|
||||
package randvar
|
||||
|
||||
import (
|
||||
"math/rand/v2"
|
||||
"sync/atomic"
|
||||
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
// Uniform is a random number generator that generates draws from a uniform
|
||||
@ -50,5 +49,5 @@ func (g *Uniform) Max() uint64 {
|
||||
// Uint64 returns a random Uint64 between min and max, drawn from a uniform
|
||||
// distribution.
|
||||
func (g *Uniform) Uint64(rng *rand.Rand) uint64 {
|
||||
return rng.Uint64n(g.Max()-g.min+1) + g.min
|
||||
return rng.Uint64N(g.Max()-g.min+1) + g.min
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
package randvar
|
||||
|
||||
import "golang.org/x/exp/rand"
|
||||
import "math/rand/v2"
|
||||
|
||||
// Weighted is a random number generator that generates numbers in the range
|
||||
// [0,len(weights)-1] where the probability of i is weights(i)/sum(weights).
|
||||
|
||||
@ -21,10 +21,11 @@ package randvar
|
||||
|
||||
import (
|
||||
"math"
|
||||
// "math/rand/v2"
|
||||
rand "math/rand/v2"
|
||||
"sync"
|
||||
|
||||
"github.com/cockroachdb/errors"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@ -16,12 +16,12 @@ import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"math"
|
||||
"math/rand/v2"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/cockroachdb/pebble/internal/base"
|
||||
"github.com/cockroachdb/pebble/shims/cmp"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
const alpha = "abcdefghijklmnopqrstuvwxyz"
|
||||
@ -458,9 +458,9 @@ func RandomSeparator(dst, a, b []byte, suffix int64, maxLength int, rng *rand.Ra
|
||||
}
|
||||
// If we can generate a key which is actually in the middle of apIdx
|
||||
// and bpIdx use it so that we don't have to bother about timestamps.
|
||||
generatedIdx = rng.Int63n(add) + start
|
||||
generatedIdx = rng.Int64N(add) + start
|
||||
for diff > 1 && generatedIdx == apIdx || generatedIdx == bpIdx {
|
||||
generatedIdx = rng.Int63n(add) + start
|
||||
generatedIdx = rng.Int64N(add) + start
|
||||
}
|
||||
}
|
||||
|
||||
@ -478,11 +478,11 @@ func RandomSeparator(dst, a, b []byte, suffix int64, maxLength int, rng *rand.Ra
|
||||
// any suffix we generate will be greater than it.
|
||||
if as == 0 {
|
||||
// bs > as
|
||||
suffix = bs + rng.Int63n(10) + 1
|
||||
suffix = bs + rng.Int64N(10) + 1
|
||||
} else {
|
||||
// bs < as.
|
||||
// Generate suffix in range [bs + 1, as - 1]
|
||||
suffix = bs + 1 + rng.Int63n(as-bs-1)
|
||||
suffix = bs + 1 + rng.Int64N(as-bs-1)
|
||||
}
|
||||
case generatedIdx == apIdx:
|
||||
// NB: The zero suffix (suffix-less) sorts before all other suffixes, so
|
||||
@ -490,11 +490,11 @@ func RandomSeparator(dst, a, b []byte, suffix int64, maxLength int, rng *rand.Ra
|
||||
if as == 0 && suffix == 0 {
|
||||
suffix++
|
||||
} else if as != 0 && suffix >= as {
|
||||
suffix = rng.Int63n(as)
|
||||
suffix = rng.Int64N(as)
|
||||
}
|
||||
case generatedIdx == bpIdx:
|
||||
if suffix <= bs {
|
||||
suffix = bs + rng.Int63n(10) + 1
|
||||
suffix = bs + rng.Int64N(10) + 1
|
||||
}
|
||||
}
|
||||
if sz := maxLength + SuffixLen(suffix); cap(dst) < sz {
|
||||
|
||||
@ -7,12 +7,12 @@ package testkeys
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"slices"
|
||||
"testing"
|
||||
|
||||
"github.com/cockroachdb/datadriven"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func TestGenerateAlphabetKey(t *testing.T) {
|
||||
@ -220,13 +220,13 @@ func keyspaceToString(ks Keyspace) string {
|
||||
}
|
||||
|
||||
func TestRandomSeparator(t *testing.T) {
|
||||
rng := rand.New(rand.NewSource(0))
|
||||
rng := rand.New(rand.NewPCG(0, 0))
|
||||
keys := [][]byte{[]byte("a"), []byte("zzz@9")}
|
||||
for n := 0; n < 1000; n++ {
|
||||
i := rng.Intn(len(keys))
|
||||
j := rng.Intn(len(keys))
|
||||
i := rng.IntN(len(keys))
|
||||
j := rng.IntN(len(keys))
|
||||
for i == j {
|
||||
j = rng.Intn(len(keys))
|
||||
j = rng.IntN(len(keys))
|
||||
}
|
||||
if i > j {
|
||||
i, j = j, i
|
||||
@ -234,7 +234,7 @@ func TestRandomSeparator(t *testing.T) {
|
||||
|
||||
a := keys[i]
|
||||
b := keys[j]
|
||||
suffix := rng.Int63n(10)
|
||||
suffix := rng.Int64N(10)
|
||||
sep := RandomSeparator(nil, a, b, suffix, 3, rng)
|
||||
t.Logf("RandomSeparator(%q, %q, %d) = %q\n", a, b, suffix, sep)
|
||||
if sep == nil {
|
||||
|
||||
@ -10,6 +10,7 @@ import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand/v2"
|
||||
"runtime"
|
||||
"sort"
|
||||
"strconv"
|
||||
@ -29,7 +30,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/sstable"
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
var testKeyValuePairs = []string{
|
||||
@ -295,7 +295,7 @@ func testIterator(
|
||||
}
|
||||
|
||||
// Test randomly generated sub-iterators.
|
||||
r := rand.New(rand.NewSource(0))
|
||||
r := rand.New(rand.NewPCG(0, 0))
|
||||
for i, nBad := 0, 0; i < 1000; i++ {
|
||||
bad := false
|
||||
|
||||
@ -1245,7 +1245,7 @@ func randStr(fill []byte, rng *rand.Rand) {
|
||||
const letters = "abcdefghijklmnopqrstuvwxyz"
|
||||
const lettersLen = len(letters)
|
||||
for i := 0; i < len(fill); i++ {
|
||||
fill[i] = letters[rng.Intn(lettersLen)]
|
||||
fill[i] = letters[rng.IntN(lettersLen)]
|
||||
}
|
||||
}
|
||||
|
||||
@ -1257,7 +1257,7 @@ func randValue(n int, rng *rand.Rand) []byte {
|
||||
|
||||
func randKey(n int, rng *rand.Rand) ([]byte, int) {
|
||||
keyPrefix := randValue(n, rng)
|
||||
suffix := rng.Intn(100)
|
||||
suffix := rng.IntN(100)
|
||||
return append(keyPrefix, []byte(fmt.Sprintf("%02d", suffix))...), suffix
|
||||
}
|
||||
|
||||
@ -1279,15 +1279,15 @@ func TestIteratorRandomizedBlockIntervalFilter(t *testing.T) {
|
||||
seed = uint64(time.Now().UnixNano())
|
||||
t.Logf("seed: %d", seed)
|
||||
}
|
||||
rng := rand.New(rand.NewSource(seed))
|
||||
opts.FlushSplitBytes = 1 << rng.Intn(8) // 1B - 256B
|
||||
opts.L0CompactionThreshold = 1 << rng.Intn(2) // 1-2
|
||||
opts.L0CompactionFileThreshold = 1 << rng.Intn(11) // 1-1024
|
||||
opts.LBaseMaxBytes = 1 << rng.Intn(11) // 1B - 1KB
|
||||
rng := rand.New(rand.NewPCG(0, seed))
|
||||
opts.FlushSplitBytes = 1 << rng.IntN(8) // 1B - 256B
|
||||
opts.L0CompactionThreshold = 1 << rng.IntN(2) // 1-2
|
||||
opts.L0CompactionFileThreshold = 1 << rng.IntN(11) // 1-1024
|
||||
opts.LBaseMaxBytes = 1 << rng.IntN(11) // 1B - 1KB
|
||||
opts.MemTableSize = 2 << 10 // 2KB
|
||||
var lopts LevelOptions
|
||||
lopts.BlockSize = 1 << rng.Intn(8) // 1B - 256B
|
||||
lopts.IndexBlockSize = 1 << rng.Intn(8) // 1B - 256B
|
||||
lopts.BlockSize = 1 << rng.IntN(8) // 1B - 256B
|
||||
lopts.IndexBlockSize = 1 << rng.IntN(8) // 1B - 256B
|
||||
opts.Levels = []LevelOptions{lopts}
|
||||
|
||||
d, err := Open("", opts)
|
||||
@ -1296,14 +1296,14 @@ func TestIteratorRandomizedBlockIntervalFilter(t *testing.T) {
|
||||
require.NoError(t, d.Close())
|
||||
}()
|
||||
matchingKeyValues := make(map[string]string)
|
||||
lower := rng.Intn(100)
|
||||
upper := rng.Intn(100)
|
||||
lower := rng.IntN(100)
|
||||
upper := rng.IntN(100)
|
||||
if lower > upper {
|
||||
lower, upper = upper, lower
|
||||
}
|
||||
n := 2000
|
||||
for i := 0; i < n; i++ {
|
||||
key, suffix := randKey(20+rng.Intn(5), rng)
|
||||
key, suffix := randKey(20+rng.IntN(5), rng)
|
||||
value := randValue(50, rng)
|
||||
if lower <= suffix && suffix < upper {
|
||||
matchingKeyValues[string(key)] = string(value)
|
||||
@ -1378,7 +1378,7 @@ func TestIteratorGuaranteedDurable(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestIteratorBoundsLifetimes(t *testing.T) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
d := newPointTestkeysDatabase(t, testkeys.Alpha(2))
|
||||
defer func() { require.NoError(t, d.Close()) }()
|
||||
|
||||
@ -1419,7 +1419,9 @@ func TestIteratorBoundsLifetimes(t *testing.T) {
|
||||
}
|
||||
trashBounds := func(bounds ...[]byte) {
|
||||
for _, bound := range bounds {
|
||||
rng.Read(bound[:])
|
||||
for j := range bound {
|
||||
bound[j] = byte(rng.Uint32())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1601,7 +1603,7 @@ func TestSetOptionsEquivalence(t *testing.T) {
|
||||
}
|
||||
|
||||
func testSetOptionsEquivalence(t *testing.T, seed uint64) {
|
||||
rng := rand.New(rand.NewSource(seed))
|
||||
rng := rand.New(rand.NewPCG(0, seed))
|
||||
ks := testkeys.Alpha(2)
|
||||
d := newTestkeysDatabase(t, ks, rng)
|
||||
defer func() { require.NoError(t, d.Close()) }()
|
||||
@ -1609,20 +1611,20 @@ func testSetOptionsEquivalence(t *testing.T, seed uint64) {
|
||||
var o IterOptions
|
||||
generateNewOptions := func() {
|
||||
// TODO(jackson): Include test coverage for block property filters, etc.
|
||||
if rng.Intn(2) == 1 {
|
||||
o.KeyTypes = IterKeyType(rng.Intn(3))
|
||||
if rng.IntN(2) == 1 {
|
||||
o.KeyTypes = IterKeyType(rng.IntN(3))
|
||||
}
|
||||
if rng.Intn(2) == 1 {
|
||||
if rng.Intn(2) == 1 {
|
||||
if rng.IntN(2) == 1 {
|
||||
if rng.IntN(2) == 1 {
|
||||
o.LowerBound = nil
|
||||
if rng.Intn(2) == 1 {
|
||||
o.LowerBound = testkeys.KeyAt(ks, rng.Int63n(ks.Count()), rng.Int63n(ks.Count()))
|
||||
if rng.IntN(2) == 1 {
|
||||
o.LowerBound = testkeys.KeyAt(ks, rng.Int64N(ks.Count()), rng.Int64N(ks.Count()))
|
||||
}
|
||||
}
|
||||
if rng.Intn(2) == 1 {
|
||||
if rng.IntN(2) == 1 {
|
||||
o.UpperBound = nil
|
||||
if rng.Intn(2) == 1 {
|
||||
o.UpperBound = testkeys.KeyAt(ks, rng.Int63n(ks.Count()), rng.Int63n(ks.Count()))
|
||||
if rng.IntN(2) == 1 {
|
||||
o.UpperBound = testkeys.KeyAt(ks, rng.Int64N(ks.Count()), rng.Int64N(ks.Count()))
|
||||
}
|
||||
}
|
||||
if testkeys.Comparer.Compare(o.LowerBound, o.UpperBound) > 0 {
|
||||
@ -1630,8 +1632,8 @@ func testSetOptionsEquivalence(t *testing.T, seed uint64) {
|
||||
}
|
||||
}
|
||||
o.RangeKeyMasking.Suffix = nil
|
||||
if o.KeyTypes == IterKeyTypePointsAndRanges && rng.Intn(2) == 1 {
|
||||
o.RangeKeyMasking.Suffix = testkeys.Suffix(rng.Int63n(ks.Count()))
|
||||
if o.KeyTypes == IterKeyTypePointsAndRanges && rng.IntN(2) == 1 {
|
||||
o.RangeKeyMasking.Suffix = testkeys.Suffix(rng.Int64N(ks.Count()))
|
||||
}
|
||||
}
|
||||
|
||||
@ -1659,7 +1661,7 @@ func testSetOptionsEquivalence(t *testing.T, seed uint64) {
|
||||
positioningOps := []func() positioningOp{
|
||||
// SeekGE
|
||||
func() positioningOp {
|
||||
k := testkeys.Key(ks, rng.Int63n(ks.Count()))
|
||||
k := testkeys.Key(ks, rng.Int64N(ks.Count()))
|
||||
return positioningOp{
|
||||
desc: fmt.Sprintf("SeekGE(%q)", k),
|
||||
run: func(it *Iterator) IterValidityState {
|
||||
@ -1669,7 +1671,7 @@ func testSetOptionsEquivalence(t *testing.T, seed uint64) {
|
||||
},
|
||||
// SeekLT
|
||||
func() positioningOp {
|
||||
k := testkeys.Key(ks, rng.Int63n(ks.Count()))
|
||||
k := testkeys.Key(ks, rng.Int64N(ks.Count()))
|
||||
return positioningOp{
|
||||
desc: fmt.Sprintf("SeekLT(%q)", k),
|
||||
run: func(it *Iterator) IterValidityState {
|
||||
@ -1679,7 +1681,7 @@ func testSetOptionsEquivalence(t *testing.T, seed uint64) {
|
||||
},
|
||||
// SeekPrefixGE
|
||||
func() positioningOp {
|
||||
k := testkeys.Key(ks, rng.Int63n(ks.Count()))
|
||||
k := testkeys.Key(ks, rng.Int64N(ks.Count()))
|
||||
return positioningOp{
|
||||
desc: fmt.Sprintf("SeekPrefixGE(%q)", k),
|
||||
run: func(it *Iterator) IterValidityState {
|
||||
@ -1705,7 +1707,7 @@ func testSetOptionsEquivalence(t *testing.T, seed uint64) {
|
||||
}
|
||||
|
||||
// Apply the same operation to both keys.
|
||||
iterOp := positioningOps[rng.Intn(len(positioningOps))]()
|
||||
iterOp := positioningOps[rng.IntN(len(positioningOps))]()
|
||||
newIterValidity := iterOp.run(newIter)
|
||||
longLivedValidity := iterOp.run(longLivedIter)
|
||||
|
||||
@ -1767,18 +1769,18 @@ func newTestkeysDatabase(t *testing.T, ks testkeys.Keyspace, rng *rand.Rand) *DB
|
||||
for i := 0; i < len(order); i++ {
|
||||
const maxVersionsPerKey = 10
|
||||
keyIndex := order[i]
|
||||
for versions := rng.Intn(maxVersionsPerKey); versions > 0; versions-- {
|
||||
n := testkeys.WriteKeyAt(keyBuf, ks, int64(keyIndex), rng.Int63n(maxVersionsPerKey))
|
||||
for versions := rng.IntN(maxVersionsPerKey); versions > 0; versions-- {
|
||||
n := testkeys.WriteKeyAt(keyBuf, ks, int64(keyIndex), rng.Int64N(maxVersionsPerKey))
|
||||
b.Set(keyBuf[:n], keyBuf[:n], nil)
|
||||
}
|
||||
|
||||
// Sometimes add a range key too.
|
||||
if rng.Intn(100) == 1 {
|
||||
startIdx := rng.Int63n(ks.Count())
|
||||
endIdx := rng.Int63n(ks.Count())
|
||||
if rng.IntN(100) == 1 {
|
||||
startIdx := rng.Int64N(ks.Count())
|
||||
endIdx := rng.Int64N(ks.Count())
|
||||
startLen := testkeys.WriteKey(keyBuf, ks, startIdx)
|
||||
endLen := testkeys.WriteKey(keyBuf2, ks, endIdx)
|
||||
suffixInt := rng.Int63n(maxVersionsPerKey)
|
||||
suffixInt := rng.Int64N(maxVersionsPerKey)
|
||||
require.NoError(t, b.RangeKeySet(
|
||||
keyBuf[:startLen],
|
||||
keyBuf2[:endLen],
|
||||
@ -1788,7 +1790,7 @@ func newTestkeysDatabase(t *testing.T, ks testkeys.Keyspace, rng *rand.Rand) *DB
|
||||
}
|
||||
|
||||
// Randomize the flush points.
|
||||
if !b.Empty() && rng.Intn(10) == 1 {
|
||||
if !b.Empty() && rng.IntN(10) == 1 {
|
||||
require.NoError(t, b.Commit(nil))
|
||||
require.NoError(t, d.Flush())
|
||||
b = d.NewBatch()
|
||||
@ -1825,11 +1827,11 @@ func BenchmarkIteratorSeekGE(b *testing.B) {
|
||||
comparer: *DefaultComparer,
|
||||
iter: m.newIter(nil),
|
||||
}
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
key := keys[rng.Intn(len(keys))]
|
||||
key := keys[rng.IntN(len(keys))]
|
||||
iter.SeekGE(key)
|
||||
}
|
||||
}
|
||||
@ -2090,7 +2092,7 @@ func BenchmarkIteratorSeqSeekGEWithBounds(b *testing.B) {
|
||||
valid = iter.Next()
|
||||
}
|
||||
if iter.Error() != nil {
|
||||
b.Fatalf(iter.Error().Error())
|
||||
b.Fatalf("%s", iter.Error().Error())
|
||||
}
|
||||
}
|
||||
iter.Close()
|
||||
@ -2146,7 +2148,7 @@ func BenchmarkIteratorSeekGENoop(b *testing.B) {
|
||||
}
|
||||
|
||||
func BenchmarkBlockPropertyFilter(b *testing.B) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
for _, matchInterval := range []int{1, 10, 100, 1000} {
|
||||
b.Run(fmt.Sprintf("match-interval=%d", matchInterval), func(b *testing.B) {
|
||||
mem := vfs.NewMem()
|
||||
@ -2209,27 +2211,27 @@ func TestRangeKeyMaskingRandomized(t *testing.T) {
|
||||
seed = uint64(time.Now().UnixNano())
|
||||
t.Logf("seed: %d", seed)
|
||||
}
|
||||
rng := rand.New(rand.NewSource(seed))
|
||||
rng := rand.New(rand.NewPCG(0, seed))
|
||||
|
||||
// Generate keyspace with point keys, and range keys which will
|
||||
// mask the point keys.
|
||||
var timestamps []int64
|
||||
for i := 0; i <= 100; i++ {
|
||||
timestamps = append(timestamps, rng.Int63n(1000))
|
||||
timestamps = append(timestamps, rng.Int64N(1000))
|
||||
}
|
||||
|
||||
ks := testkeys.Alpha(5)
|
||||
numKeys := 1000 + rng.Intn(9000)
|
||||
numKeys := 1000 + rng.IntN(9000)
|
||||
keys := make([][]byte, numKeys)
|
||||
keyTimeStamps := make([]int64, numKeys) // ts associated with the keys.
|
||||
for i := 0; i < numKeys; i++ {
|
||||
keys[i] = make([]byte, 5+testkeys.MaxSuffixLen)
|
||||
keyTimeStamps[i] = timestamps[rng.Intn(len(timestamps))]
|
||||
n := testkeys.WriteKeyAt(keys[i], ks, rng.Int63n(ks.Count()), keyTimeStamps[i])
|
||||
keyTimeStamps[i] = timestamps[rng.IntN(len(timestamps))]
|
||||
n := testkeys.WriteKeyAt(keys[i], ks, rng.Int64N(ks.Count()), keyTimeStamps[i])
|
||||
keys[i] = keys[i][:n]
|
||||
}
|
||||
|
||||
numRangeKeys := rng.Intn(20)
|
||||
numRangeKeys := rng.IntN(20)
|
||||
type rkey struct {
|
||||
start []byte
|
||||
end []byte
|
||||
@ -2241,18 +2243,18 @@ func TestRangeKeyMaskingRandomized(t *testing.T) {
|
||||
rkeys[i].start = make([]byte, 5)
|
||||
rkeys[i].end = make([]byte, 5)
|
||||
|
||||
testkeys.WriteKey(rkeys[i].start[:5], ks, rng.Int63n(ks.Count()))
|
||||
testkeys.WriteKey(rkeys[i].end[:5], ks, rng.Int63n(ks.Count()))
|
||||
testkeys.WriteKey(rkeys[i].start[:5], ks, rng.Int64N(ks.Count()))
|
||||
testkeys.WriteKey(rkeys[i].end[:5], ks, rng.Int64N(ks.Count()))
|
||||
|
||||
for bytes.Equal(rkeys[i].start[:5], rkeys[i].end[:5]) {
|
||||
testkeys.WriteKey(rkeys[i].end[:5], ks, rng.Int63n(ks.Count()))
|
||||
testkeys.WriteKey(rkeys[i].end[:5], ks, rng.Int64N(ks.Count()))
|
||||
}
|
||||
|
||||
if bytes.Compare(rkeys[i].start[:5], rkeys[i].end[:5]) > 0 {
|
||||
rkeys[i].start, rkeys[i].end = rkeys[i].end, rkeys[i].start
|
||||
}
|
||||
|
||||
rkeyTimestamp := timestamps[rng.Intn(len(timestamps))]
|
||||
rkeyTimestamp := timestamps[rng.IntN(len(timestamps))]
|
||||
rkeys[i].suffix = []byte("@" + strconv.FormatInt(rkeyTimestamp, 10))
|
||||
|
||||
// Each time we create a range key, check if the range key masks any
|
||||
@ -2291,12 +2293,12 @@ func TestRangeKeyMaskingRandomized(t *testing.T) {
|
||||
randomOpts := testOpts{
|
||||
levelOpts: []LevelOptions{
|
||||
{
|
||||
TargetFileSize: int64(1 + rng.Intn(2<<20)), // Vary the L0 file size.
|
||||
BlockSize: 1 + rng.Intn(32<<10),
|
||||
TargetFileSize: int64(1 + rng.IntN(2<<20)), // Vary the L0 file size.
|
||||
BlockSize: 1 + rng.IntN(32<<10),
|
||||
},
|
||||
},
|
||||
}
|
||||
if rng.Intn(2) == 0 {
|
||||
if rng.IntN(2) == 0 {
|
||||
randomOpts.filter = func() BlockPropertyFilterMask {
|
||||
return sstable.NewTestKeysMaskingFilter()
|
||||
}
|
||||
@ -2401,14 +2403,14 @@ func TestRangeKeyMaskingRandomized(t *testing.T) {
|
||||
t.Fatalf("iteration didn't produce identical results")
|
||||
}
|
||||
if hasP1 && !bytes.Equal(iter1.Key(), iter2.Key()) {
|
||||
t.Fatalf(fmt.Sprintf("iteration didn't produce identical point keys: %s, %s", iter1.Key(), iter2.Key()))
|
||||
t.Fatalf("%s", fmt.Sprintf("iteration didn't produce identical point keys: %s, %s", iter1.Key(), iter2.Key()))
|
||||
}
|
||||
if hasR1 {
|
||||
// Confirm that the range key is the same.
|
||||
b1, e1 := iter1.RangeBounds()
|
||||
b2, e2 := iter2.RangeBounds()
|
||||
if !bytes.Equal(b1, b2) || !bytes.Equal(e1, e2) {
|
||||
t.Fatalf(fmt.Sprintf(
|
||||
t.Fatalf("%s", fmt.Sprintf(
|
||||
"iteration didn't produce identical range keys: [%s, %s], [%s, %s]",
|
||||
b1, e1, b2, e2,
|
||||
))
|
||||
@ -2419,7 +2421,7 @@ func TestRangeKeyMaskingRandomized(t *testing.T) {
|
||||
// Confirm that the returned point key wasn't hidden.
|
||||
for j, pkey := range keys {
|
||||
if bytes.Equal(iter1.Key(), pkey) && pointKeyHidden[j] {
|
||||
t.Fatalf(fmt.Sprintf("hidden point key was exposed %s %d", pkey, keyTimeStamps[j]))
|
||||
t.Fatalf("%s", fmt.Sprintf("hidden point key was exposed %s %d", pkey, keyTimeStamps[j]))
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2439,7 +2441,7 @@ func BenchmarkIterator_RangeKeyMasking(b *testing.B) {
|
||||
keysPerBatch = 50
|
||||
)
|
||||
var alloc bytealloc.A
|
||||
rng := rand.New(rand.NewSource(uint64(1658872515083979000)))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(1658872515083979000)))
|
||||
keyBuf := make([]byte, prefixLen+testkeys.MaxSuffixLen)
|
||||
valBuf := make([]byte, valueSize)
|
||||
|
||||
@ -2462,7 +2464,7 @@ func BenchmarkIterator_RangeKeyMasking(b *testing.B) {
|
||||
batch := d.NewBatch()
|
||||
for k := 0; k < keysPerBatch; k++ {
|
||||
randStr(keyBuf[:prefixLen], rng)
|
||||
suffix := rng.Int63n(100)
|
||||
suffix := rng.Int64N(100)
|
||||
suffixLen := testkeys.WriteSuffix(keyBuf[prefixLen:], suffix)
|
||||
randStr(valBuf[:], rng)
|
||||
|
||||
@ -2574,7 +2576,7 @@ func BenchmarkIterator_RangeKeyMasking(b *testing.B) {
|
||||
func BenchmarkIteratorScan(b *testing.B) {
|
||||
const maxPrefixLen = 8
|
||||
keyBuf := make([]byte, maxPrefixLen+testkeys.MaxSuffixLen)
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
for _, keyCount := range []int64{100, 1000, 10000} {
|
||||
for _, readAmp := range []int{1, 3, 7, 10} {
|
||||
@ -2601,7 +2603,7 @@ func BenchmarkIteratorScan(b *testing.B) {
|
||||
for _, ks := range testkeys.Divvy(keys, int64(readAmp)) {
|
||||
batch := d.NewBatch()
|
||||
for i := int64(0); i < ks.Count(); i++ {
|
||||
n := testkeys.WriteKeyAt(keyBuf[:], ks, i, rng.Int63n(100))
|
||||
n := testkeys.WriteKeyAt(keyBuf[:], ks, i, rng.Int64N(100))
|
||||
batch.Set(keyBuf[:n], keyBuf[:n], nil)
|
||||
}
|
||||
require.NoError(b, batch.Commit(nil))
|
||||
@ -2722,7 +2724,7 @@ func BenchmarkIteratorScanNextPrefix(b *testing.B) {
|
||||
func BenchmarkCombinedIteratorSeek(b *testing.B) {
|
||||
for _, withRangeKey := range []bool{false, true} {
|
||||
b.Run(fmt.Sprintf("range-key=%t", withRangeKey), func(b *testing.B) {
|
||||
rng := rand.New(rand.NewSource(uint64(1658872515083979000)))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(1658872515083979000)))
|
||||
ks := testkeys.Alpha(1)
|
||||
opts := &Options{
|
||||
FS: vfs.NewMem(),
|
||||
@ -2737,7 +2739,9 @@ func BenchmarkCombinedIteratorSeek(b *testing.B) {
|
||||
for i := int64(0); i < ks.Count(); i++ {
|
||||
keys[i] = testkeys.Key(ks, i)
|
||||
var val [40]byte
|
||||
rng.Read(val[:])
|
||||
for j := range val {
|
||||
val[j] = byte(rng.Uint32())
|
||||
}
|
||||
require.NoError(b, d.Set(keys[i], val[:], nil))
|
||||
}
|
||||
if withRangeKey {
|
||||
@ -2821,7 +2825,7 @@ func BenchmarkCombinedIteratorSeekPrefix(b *testing.B) {
|
||||
}
|
||||
|
||||
func buildFragmentedRangeKey(b testing.TB, seed uint64) (d *DB, keys [][]byte) {
|
||||
rng := rand.New(rand.NewSource(seed))
|
||||
rng := rand.New(rand.NewPCG(0, seed))
|
||||
ks := testkeys.Alpha(2)
|
||||
opts := &Options{
|
||||
FS: vfs.NewMem(),
|
||||
@ -2843,7 +2847,9 @@ func buildFragmentedRangeKey(b testing.TB, seed uint64) (d *DB, keys [][]byte) {
|
||||
}
|
||||
for i := 0; i < len(keys); i++ {
|
||||
var val [40]byte
|
||||
rng.Read(val[:])
|
||||
for j := range val {
|
||||
val[j] = byte(rng.Uint32())
|
||||
}
|
||||
require.NoError(b, d.Set(keys[i], val[:], nil))
|
||||
if i < len(keys)-1 {
|
||||
require.NoError(b, d.RangeKeySet(keys[i], keys[i+1], []byte("@5"), nil, nil))
|
||||
|
||||
@ -8,6 +8,7 @@ import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
@ -24,7 +25,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/sstable"
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -532,11 +532,11 @@ func BenchmarkLevelIterSeekGE(b *testing.B) {
|
||||
return iter, nil, err
|
||||
}
|
||||
l := newLevelIter(context.Background(), IterOptions{}, DefaultComparer, newIters, metas.Iter(), manifest.Level(level), internalIterOpts{})
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
l.SeekGE(keys[rng.Intn(len(keys))], base.SeekGEFlagsNone)
|
||||
l.SeekGE(keys[rng.IntN(len(keys))], base.SeekGEFlagsNone)
|
||||
}
|
||||
l.Close()
|
||||
})
|
||||
|
||||
@ -8,6 +8,7 @@ import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
@ -21,7 +22,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/internal/itertest"
|
||||
"github.com/cockroachdb/pebble/internal/rangekey"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
"golang.org/x/sync/errgroup"
|
||||
)
|
||||
|
||||
@ -193,9 +193,9 @@ func TestMemTable1000Entries(t *testing.T) {
|
||||
t.Fatalf("count: got %v, want %v", got, want)
|
||||
}
|
||||
// Check random-access lookup.
|
||||
r := rand.New(rand.NewSource(0))
|
||||
r := rand.New(rand.NewPCG(0, 0))
|
||||
for i := 0; i < 3*N; i++ {
|
||||
j := r.Intn(N)
|
||||
j := r.IntN(N)
|
||||
k := []byte(strconv.Itoa(j))
|
||||
v, err := m0.get(k)
|
||||
require.NoError(t, err)
|
||||
@ -418,11 +418,11 @@ func buildMemTable(b *testing.B) (*memTable, [][]byte) {
|
||||
func BenchmarkMemTableIterSeekGE(b *testing.B) {
|
||||
m, keys := buildMemTable(b)
|
||||
iter := m.newIter(nil)
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
iter.SeekGE(keys[rng.Intn(len(keys))], base.SeekGEFlagsNone)
|
||||
iter.SeekGE(keys[rng.IntN(len(keys))], base.SeekGEFlagsNone)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -7,6 +7,7 @@ package pebble
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
@ -23,7 +24,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/sstable"
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func TestMergingIter(t *testing.T) {
|
||||
@ -36,9 +36,9 @@ func TestMergingIter(t *testing.T) {
|
||||
// Shuffle testKeyValuePairs into one or more splits. Each individual
|
||||
// split is in increasing order, but different splits may overlap in
|
||||
// range. Some of the splits may be empty.
|
||||
splits := make([][]string, 1+r.Intn(2+len(testKeyValuePairs)))
|
||||
splits := make([][]string, 1+r.IntN(2+len(testKeyValuePairs)))
|
||||
for _, kv := range testKeyValuePairs {
|
||||
j := r.Intn(len(splits))
|
||||
j := r.IntN(len(splits))
|
||||
splits[j] = append(splits[j], kv)
|
||||
}
|
||||
return splits
|
||||
@ -322,7 +322,7 @@ func buildMergingIterTables(
|
||||
key := []byte(fmt.Sprintf("%08d", i))
|
||||
keys = append(keys, key)
|
||||
ikey.UserKey = key
|
||||
j := rand.Intn(len(writers))
|
||||
j := rand.IntN(len(writers))
|
||||
w := writers[j]
|
||||
w.Add(ikey, nil)
|
||||
}
|
||||
@ -378,11 +378,11 @@ func BenchmarkMergingIterSeekGE(b *testing.B) {
|
||||
var stats base.InternalIteratorStats
|
||||
m := newMergingIter(nil /* logger */, &stats, DefaultComparer.Compare,
|
||||
func(a []byte) int { return len(a) }, iters...)
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
m.SeekGE(keys[rng.Intn(len(keys))], base.SeekGEFlagsNone)
|
||||
m.SeekGE(keys[rng.IntN(len(keys))], base.SeekGEFlagsNone)
|
||||
}
|
||||
m.Close()
|
||||
})
|
||||
|
||||
@ -7,12 +7,12 @@ package metamorphic
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"slices"
|
||||
|
||||
"github.com/cockroachdb/pebble"
|
||||
"github.com/cockroachdb/pebble/internal/randvar"
|
||||
"github.com/cockroachdb/pebble/internal/testkeys"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
const maxValueSize = 20
|
||||
@ -222,7 +222,7 @@ func (g *generator) randPrefixToWrite(newPrefix float64) []byte {
|
||||
prefixes := g.keyManager.prefixes()
|
||||
if len(prefixes) > 0 && g.rng.Float64() > newPrefix {
|
||||
// Use an existing prefix.
|
||||
p := g.rng.Intn(len(prefixes))
|
||||
p := g.rng.IntN(len(prefixes))
|
||||
return prefixes[p]
|
||||
}
|
||||
|
||||
@ -261,7 +261,7 @@ func (g *generator) randSuffixToRead() []byte {
|
||||
// When reading, don't apply the recency skewing in order to better exercise
|
||||
// a reading a mix of older and newer keys.
|
||||
max := g.cfg.writeSuffixDist.Max()
|
||||
return suffixFromInt(g.rng.Int63n(int64(max)))
|
||||
return suffixFromInt(g.rng.Int64N(int64(max)))
|
||||
}
|
||||
|
||||
func suffixFromInt(suffix int64) []byte {
|
||||
@ -279,7 +279,7 @@ func (g *generator) randKeyToSingleDelete(id, dbID objID) []byte {
|
||||
if length == 0 {
|
||||
return nil
|
||||
}
|
||||
return keys[g.rng.Intn(length)]
|
||||
return keys[g.rng.IntN(length)]
|
||||
}
|
||||
|
||||
// randKeyToRead returns a key for read operations.
|
||||
@ -299,7 +299,7 @@ func (g *generator) randKeyHelper(
|
||||
switch {
|
||||
case len(keys) > 0 && g.rng.Float64() > newKey:
|
||||
// Use an existing user key.
|
||||
return keys[g.rng.Intn(len(keys))]
|
||||
return keys[g.rng.IntN(len(keys))]
|
||||
|
||||
case len(keys) > 0 && g.rng.Float64() > g.cfg.newPrefix:
|
||||
// Use an existing prefix but a new suffix, producing a new user key.
|
||||
@ -317,7 +317,7 @@ func (g *generator) randKeyHelper(
|
||||
for {
|
||||
// Pick a prefix on each iteration in case most or all suffixes are
|
||||
// already in use for any individual prefix.
|
||||
p := g.rng.Intn(len(prefixes))
|
||||
p := g.rng.IntN(len(prefixes))
|
||||
suffix := int64(g.cfg.writeSuffixDist.Uint64(g.rng))
|
||||
|
||||
var key []byte
|
||||
@ -354,7 +354,7 @@ func (g *generator) randKeyHelper(
|
||||
// If we have bounds in which we need to generate the key, use
|
||||
// testkeys.RandomSeparator to generate a key between the bounds.
|
||||
if newKeyBounds != nil {
|
||||
targetLength := 4 + g.rng.Intn(8)
|
||||
targetLength := 4 + g.rng.IntN(8)
|
||||
key = testkeys.RandomSeparator(nil, g.prefix(newKeyBounds.Start), g.prefix(newKeyBounds.End),
|
||||
suffix, targetLength, g.rng)
|
||||
} else {
|
||||
@ -379,7 +379,7 @@ func (g *generator) randKeyHelperSuffix(
|
||||
) []byte {
|
||||
n := minPrefixLen
|
||||
if maxPrefixLen > minPrefixLen {
|
||||
n += g.rng.Intn(maxPrefixLen - minPrefixLen)
|
||||
n += g.rng.IntN(maxPrefixLen - minPrefixLen)
|
||||
}
|
||||
// In order to test a mix of suffixed and unsuffixed keys, omit the zero
|
||||
// suffix.
|
||||
@ -407,7 +407,7 @@ func resizeBuffer(buf []byte, prefixLen, suffixLen int) []byte {
|
||||
func (g *generator) randValue(min, max int) []byte {
|
||||
n := min
|
||||
if max > min {
|
||||
n += g.rng.Intn(max - min)
|
||||
n += g.rng.IntN(max - min)
|
||||
}
|
||||
if n == 0 {
|
||||
return nil
|
||||
@ -548,7 +548,7 @@ func (g *generator) dbCheckpoint() {
|
||||
// 1/8 of the time we restrict to 2 spans; etc.
|
||||
numSpans := 0
|
||||
var spans []pebble.CheckpointSpan
|
||||
for g.rng.Intn(2) == 0 {
|
||||
for g.rng.IntN(2) == 0 {
|
||||
numSpans++
|
||||
}
|
||||
if numSpans > 0 {
|
||||
@ -598,7 +598,7 @@ func (g *generator) dbRatchetFormatMajorVersion() {
|
||||
|
||||
dbID := g.dbs.rand(g.rng)
|
||||
n := int(newestFormatMajorVersionToTest - minimumFormatMajorVersion)
|
||||
vers := pebble.FormatMajorVersion(g.rng.Intn(n+1)) + minimumFormatMajorVersion
|
||||
vers := pebble.FormatMajorVersion(g.rng.IntN(n+1)) + minimumFormatMajorVersion
|
||||
g.add(&dbRatchetFormatMajorVersionOp{dbID: dbID, vers: vers})
|
||||
}
|
||||
|
||||
@ -638,7 +638,7 @@ func (g *generator) maybeSetSnapshotIterBounds(readerID objID, opts *iterOpts) b
|
||||
return false
|
||||
}
|
||||
// Pick a random keyrange within one of the snapshot's key ranges.
|
||||
parentBounds := snapBounds[g.rng.Intn(len(snapBounds))]
|
||||
parentBounds := snapBounds[g.rng.IntN(len(snapBounds))]
|
||||
// With 10% probability, use the parent start bound as-is.
|
||||
if g.rng.Float64() <= 0.1 {
|
||||
opts.lower = parentBounds.Start
|
||||
@ -648,7 +648,7 @@ func (g *generator) maybeSetSnapshotIterBounds(readerID objID, opts *iterOpts) b
|
||||
parentBounds.Start,
|
||||
parentBounds.End,
|
||||
0, /* suffix */
|
||||
4+g.rng.Intn(8),
|
||||
4+g.rng.IntN(8),
|
||||
g.rng,
|
||||
)
|
||||
}
|
||||
@ -661,7 +661,7 @@ func (g *generator) maybeSetSnapshotIterBounds(readerID objID, opts *iterOpts) b
|
||||
opts.lower,
|
||||
parentBounds.End,
|
||||
0, /* suffix */
|
||||
4+g.rng.Intn(8),
|
||||
4+g.rng.IntN(8),
|
||||
g.rng,
|
||||
)
|
||||
}
|
||||
@ -708,7 +708,7 @@ func (g *generator) newIter() {
|
||||
// ensure determinism.
|
||||
if g.rng.Float64() <= 0.1 {
|
||||
max := g.cfg.writeSuffixDist.Max()
|
||||
opts.filterMin, opts.filterMax = g.rng.Uint64n(max)+1, g.rng.Uint64n(max)+1
|
||||
opts.filterMin, opts.filterMax = g.rng.Uint64N(max)+1, g.rng.Uint64N(max)+1
|
||||
if opts.filterMin > opts.filterMax {
|
||||
opts.filterMin, opts.filterMax = opts.filterMax, opts.filterMin
|
||||
} else if opts.filterMin == opts.filterMax {
|
||||
@ -741,7 +741,7 @@ func (g *generator) randKeyTypesAndMask() (keyTypes uint32, maskSuffix []byte) {
|
||||
case p < 0.8: // 60% probability
|
||||
keyTypes = uint32(pebble.IterKeyTypePointsAndRanges)
|
||||
// With 50% probability, enable masking.
|
||||
if g.rng.Intn(2) == 1 {
|
||||
if g.rng.IntN(2) == 1 {
|
||||
maskSuffix = g.randSuffixToRead()
|
||||
}
|
||||
default: // 20% probability
|
||||
@ -784,13 +784,13 @@ func (g *generator) newIterUsingClone() {
|
||||
|
||||
var refreshBatch bool
|
||||
if readerID.tag() == batchTag {
|
||||
refreshBatch = g.rng.Intn(2) == 1
|
||||
refreshBatch = g.rng.IntN(2) == 1
|
||||
}
|
||||
|
||||
opts := g.itersLastOpts[existingIterID]
|
||||
// With 50% probability, consider modifying the iterator options used by the
|
||||
// clone.
|
||||
if g.rng.Intn(2) == 1 {
|
||||
if g.rng.IntN(2) == 1 {
|
||||
g.maybeMutateOptions(readerID, &opts)
|
||||
}
|
||||
g.itersLastOpts[iterID] = opts
|
||||
@ -1004,7 +1004,7 @@ func (g *generator) iterSeekPrefixGE(iterID objID) {
|
||||
// batches which haven't been presisted to the DB. But we're only picking
|
||||
// keys in a best effort manner, and the logic is better than picking a
|
||||
// random key.
|
||||
if g.rng.Intn(10) >= 1 {
|
||||
if g.rng.IntN(10) >= 1 {
|
||||
possibleKeys := make([][]byte, 0, 100)
|
||||
inRangeKeys := g.randKeyToReadWithinBounds(lower, upper, g.objDB[iterID])
|
||||
for _, keyMeta := range inRangeKeys {
|
||||
@ -1027,7 +1027,7 @@ func (g *generator) iterSeekPrefixGE(iterID objID) {
|
||||
}
|
||||
|
||||
if len(possibleKeys) > 0 {
|
||||
key = []byte(possibleKeys[g.rng.Int31n(int32(len(possibleKeys)))])
|
||||
key = []byte(possibleKeys[g.rng.Int32N(int32(len(possibleKeys)))])
|
||||
}
|
||||
}
|
||||
|
||||
@ -1148,7 +1148,7 @@ func (g *generator) readerGet() {
|
||||
// ranges, restrict the read to fall within one of the provided key ranges.
|
||||
var key []byte
|
||||
if bounds := g.snapshotBounds[readerID]; len(bounds) > 0 {
|
||||
kr := bounds[g.rng.Intn(len(bounds))]
|
||||
kr := bounds[g.rng.IntN(len(bounds))]
|
||||
key = g.randKeyToReadInRange(0.001, kr) // 0.1% new keys
|
||||
} else {
|
||||
key = g.randKeyToRead(0.001) // 0.1% new keys
|
||||
@ -1238,7 +1238,7 @@ func (g *generator) newSnapshot() {
|
||||
// (eg. replicateOp) to work.
|
||||
if g.rng.Float64() < 0.75 || g.dbs.Len() > 1 {
|
||||
s.bounds = g.generateDisjointKeyRanges(
|
||||
g.rng.Intn(5) + 1, /* between 1-5 */
|
||||
g.rng.IntN(5) + 1, /* between 1-5 */
|
||||
)
|
||||
g.snapshotBounds[snapID] = s.bounds
|
||||
}
|
||||
@ -1421,7 +1421,7 @@ func (g *generator) writerIngest() {
|
||||
|
||||
dbID := g.dbs.rand(g.rng)
|
||||
// Ingest between 1 and 3 batches.
|
||||
batchIDs := make([]objID, 0, 1+g.rng.Intn(3))
|
||||
batchIDs := make([]objID, 0, 1+g.rng.IntN(3))
|
||||
canFail := cap(batchIDs) > 1
|
||||
for i := 0; i < cap(batchIDs); i++ {
|
||||
batchID := g.liveBatches.rand(g.rng)
|
||||
@ -1509,21 +1509,21 @@ func (g *generator) maybeMutateOptions(readerID objID, opts *iterOpts) {
|
||||
// With 95% probability, allow changes to any options at all. This ensures
|
||||
// that in 5% of cases there are no changes, and SetOptions hits its fast
|
||||
// path.
|
||||
if g.rng.Intn(100) >= 5 {
|
||||
if g.rng.IntN(100) >= 5 {
|
||||
if !g.maybeSetSnapshotIterBounds(readerID, opts) {
|
||||
// With 1/3 probability, clear existing bounds.
|
||||
if opts.lower != nil && g.rng.Intn(3) == 0 {
|
||||
if opts.lower != nil && g.rng.IntN(3) == 0 {
|
||||
opts.lower = nil
|
||||
}
|
||||
if opts.upper != nil && g.rng.Intn(3) == 0 {
|
||||
if opts.upper != nil && g.rng.IntN(3) == 0 {
|
||||
opts.upper = nil
|
||||
}
|
||||
// With 1/3 probability, update the bounds.
|
||||
if g.rng.Intn(3) == 0 {
|
||||
if g.rng.IntN(3) == 0 {
|
||||
// Generate a new key with a .1% probability.
|
||||
opts.lower = g.randKeyToRead(0.001)
|
||||
}
|
||||
if g.rng.Intn(3) == 0 {
|
||||
if g.rng.IntN(3) == 0 {
|
||||
// Generate a new key with a .1% probability.
|
||||
opts.upper = g.randKeyToRead(0.001)
|
||||
}
|
||||
@ -1533,18 +1533,18 @@ func (g *generator) maybeMutateOptions(readerID objID, opts *iterOpts) {
|
||||
}
|
||||
|
||||
// With 1/3 probability, update the key-types/mask.
|
||||
if g.rng.Intn(3) == 0 {
|
||||
if g.rng.IntN(3) == 0 {
|
||||
opts.keyTypes, opts.maskSuffix = g.randKeyTypesAndMask()
|
||||
}
|
||||
|
||||
// With 1/3 probability, clear existing filter.
|
||||
if opts.filterMax > 0 && g.rng.Intn(3) == 0 {
|
||||
if opts.filterMax > 0 && g.rng.IntN(3) == 0 {
|
||||
opts.filterMax, opts.filterMin = 0, 0
|
||||
}
|
||||
// With 10% probability, set a filter range.
|
||||
if g.rng.Intn(10) == 1 {
|
||||
if g.rng.IntN(10) == 1 {
|
||||
max := g.cfg.writeSuffixDist.Max()
|
||||
opts.filterMin, opts.filterMax = g.rng.Uint64n(max)+1, g.rng.Uint64n(max)+1
|
||||
opts.filterMin, opts.filterMax = g.rng.Uint64N(max)+1, g.rng.Uint64N(max)+1
|
||||
if opts.filterMin > opts.filterMax {
|
||||
opts.filterMin, opts.filterMax = opts.filterMax, opts.filterMin
|
||||
} else if opts.filterMin == opts.filterMax {
|
||||
@ -1559,7 +1559,7 @@ func (g *generator) maybeMutateOptions(readerID objID, opts *iterOpts) {
|
||||
}
|
||||
|
||||
func (g *generator) pickOneUniform(options ...func(objID)) func(objID) {
|
||||
i := g.rng.Intn(len(options))
|
||||
i := g.rng.IntN(len(options))
|
||||
return options[i]
|
||||
}
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@ package metamorphic
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@ -13,7 +14,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/internal/randvar"
|
||||
"github.com/pmezard/go-difflib/difflib"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func TestGenerator(t *testing.T) {
|
||||
@ -131,7 +131,7 @@ func TestGeneratorRandom(t *testing.T) {
|
||||
ops := randvar.NewUniform(1000, 10000)
|
||||
cfgs := []string{"default", "multiInstance"}
|
||||
generateFromSeed := func(cfg config) string {
|
||||
rng := rand.New(rand.NewSource(seed))
|
||||
rng := rand.New(rand.NewPCG(0, seed))
|
||||
count := ops.Uint64(rng)
|
||||
return formatOps(generate(rng, count, cfg, newKeyManager(cfg.numInstances)))
|
||||
}
|
||||
|
||||
@ -12,6 +12,7 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand/v2"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
@ -30,7 +31,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/vfs/errorfs"
|
||||
"github.com/pmezard/go-difflib/difflib"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
"golang.org/x/sync/errgroup"
|
||||
)
|
||||
|
||||
@ -161,13 +161,13 @@ func RunAndCompare(t *testing.T, rootDir string, rOpts ...RunOption) {
|
||||
}
|
||||
}()
|
||||
|
||||
rng := rand.New(rand.NewSource(runOpts.seed))
|
||||
rng := rand.New(rand.NewPCG(0, runOpts.seed))
|
||||
opCount := runOpts.ops.Uint64(rng)
|
||||
|
||||
// Generate a new set of random ops, writing them to <dir>/ops. These will be
|
||||
// read by the child processes when performing a test run.
|
||||
km := newKeyManager(runOpts.numInstances)
|
||||
cfg := presetConfigs[rng.Intn(len(presetConfigs))]
|
||||
cfg := presetConfigs[rng.IntN(len(presetConfigs))]
|
||||
if runOpts.previousOpsPath != "" {
|
||||
// During cross-version testing, we load keys from an `ops` file
|
||||
// produced by a metamorphic test run of an earlier Pebble version.
|
||||
|
||||
@ -7,6 +7,7 @@ package metamorphic
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
@ -22,7 +23,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/objstorage/remote"
|
||||
"github.com/cockroachdb/pebble/sstable"
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -439,13 +439,13 @@ func randomOptions(
|
||||
{
|
||||
var privateOpts bytes.Buffer
|
||||
fmt.Fprintln(&privateOpts, `[Options]`)
|
||||
if rng.Intn(3) == 0 /* 33% */ {
|
||||
if rng.IntN(3) == 0 /* 33% */ {
|
||||
fmt.Fprintln(&privateOpts, ` disable_delete_only_compactions=true`)
|
||||
}
|
||||
if rng.Intn(3) == 0 /* 33% */ {
|
||||
if rng.IntN(3) == 0 /* 33% */ {
|
||||
fmt.Fprintln(&privateOpts, ` disable_elision_only_compactions=true`)
|
||||
}
|
||||
if rng.Intn(5) == 0 /* 20% */ {
|
||||
if rng.IntN(5) == 0 /* 20% */ {
|
||||
fmt.Fprintln(&privateOpts, ` disable_lazy_combined_iteration=true`)
|
||||
}
|
||||
if privateOptsStr := privateOpts.String(); privateOptsStr != `[Options]\n` {
|
||||
@ -453,68 +453,68 @@ func randomOptions(
|
||||
}
|
||||
}
|
||||
|
||||
opts.BytesPerSync = 1 << uint(rng.Intn(28)) // 1B - 256MB
|
||||
opts.Cache = cache.New(1 << uint(rng.Intn(30))) // 1B - 1GB
|
||||
opts.DisableWAL = rng.Intn(2) == 0
|
||||
opts.FlushDelayDeleteRange = time.Millisecond * time.Duration(5*rng.Intn(245)) // 5-250ms
|
||||
opts.FlushDelayRangeKey = time.Millisecond * time.Duration(5*rng.Intn(245)) // 5-250ms
|
||||
opts.FlushSplitBytes = 1 << rng.Intn(20) // 1B - 1MB
|
||||
opts.BytesPerSync = 1 << uint(rng.IntN(28)) // 1B - 256MB
|
||||
opts.Cache = cache.New(1 << uint(rng.IntN(30))) // 1B - 1GB
|
||||
opts.DisableWAL = rng.IntN(2) == 0
|
||||
opts.FlushDelayDeleteRange = time.Millisecond * time.Duration(5*rng.IntN(245)) // 5-250ms
|
||||
opts.FlushDelayRangeKey = time.Millisecond * time.Duration(5*rng.IntN(245)) // 5-250ms
|
||||
opts.FlushSplitBytes = 1 << rng.IntN(20) // 1B - 1MB
|
||||
opts.FormatMajorVersion = minimumFormatMajorVersion
|
||||
n := int(newestFormatMajorVersionToTest - opts.FormatMajorVersion)
|
||||
opts.FormatMajorVersion += pebble.FormatMajorVersion(rng.Intn(n + 1))
|
||||
opts.Experimental.L0CompactionConcurrency = 1 + rng.Intn(4) // 1-4
|
||||
opts.Experimental.LevelMultiplier = 5 << rng.Intn(7) // 5 - 320
|
||||
opts.TargetByteDeletionRate = 1 << uint(20+rng.Intn(10)) // 1MB - 1GB
|
||||
opts.Experimental.ValidateOnIngest = rng.Intn(2) != 0
|
||||
opts.L0CompactionThreshold = 1 + rng.Intn(100) // 1 - 100
|
||||
opts.L0CompactionFileThreshold = 1 << rng.Intn(11) // 1 - 1024
|
||||
opts.L0StopWritesThreshold = 1 + rng.Intn(100) // 1 - 100
|
||||
opts.FormatMajorVersion += pebble.FormatMajorVersion(rng.IntN(n + 1))
|
||||
opts.Experimental.L0CompactionConcurrency = 1 + rng.IntN(4) // 1-4
|
||||
opts.Experimental.LevelMultiplier = 5 << rng.IntN(7) // 5 - 320
|
||||
opts.TargetByteDeletionRate = 1 << uint(20+rng.IntN(10)) // 1MB - 1GB
|
||||
opts.Experimental.ValidateOnIngest = rng.IntN(2) != 0
|
||||
opts.L0CompactionThreshold = 1 + rng.IntN(100) // 1 - 100
|
||||
opts.L0CompactionFileThreshold = 1 << rng.IntN(11) // 1 - 1024
|
||||
opts.L0StopWritesThreshold = 1 + rng.IntN(100) // 1 - 100
|
||||
if opts.L0StopWritesThreshold < opts.L0CompactionThreshold {
|
||||
opts.L0StopWritesThreshold = opts.L0CompactionThreshold
|
||||
}
|
||||
opts.LBaseMaxBytes = 1 << uint(rng.Intn(30)) // 1B - 1GB
|
||||
maxConcurrentCompactions := rng.Intn(3) + 1 // 1-3
|
||||
opts.LBaseMaxBytes = 1 << uint(rng.IntN(30)) // 1B - 1GB
|
||||
maxConcurrentCompactions := rng.IntN(3) + 1 // 1-3
|
||||
opts.MaxConcurrentCompactions = func() int {
|
||||
return maxConcurrentCompactions
|
||||
}
|
||||
opts.MaxManifestFileSize = 1 << uint(rng.Intn(30)) // 1B - 1GB
|
||||
opts.MemTableSize = 2 << (10 + uint(rng.Intn(16))) // 2KB - 256MB
|
||||
opts.MemTableStopWritesThreshold = 2 + rng.Intn(5) // 2 - 5
|
||||
if rng.Intn(2) == 0 {
|
||||
opts.MaxManifestFileSize = 1 << uint(rng.IntN(30)) // 1B - 1GB
|
||||
opts.MemTableSize = 2 << (10 + uint(rng.IntN(16))) // 2KB - 256MB
|
||||
opts.MemTableStopWritesThreshold = 2 + rng.IntN(5) // 2 - 5
|
||||
if rng.IntN(2) == 0 {
|
||||
opts.WALDir = "data/wal"
|
||||
}
|
||||
if rng.Intn(4) == 0 {
|
||||
if rng.IntN(4) == 0 {
|
||||
// Enable Writer parallelism for 25% of the random options. Setting
|
||||
// MaxWriterConcurrency to any value greater than or equal to 1 has the
|
||||
// same effect currently.
|
||||
opts.Experimental.MaxWriterConcurrency = 2
|
||||
opts.Experimental.ForceWriterParallelism = true
|
||||
}
|
||||
if rng.Intn(2) == 0 {
|
||||
if rng.IntN(2) == 0 {
|
||||
opts.Experimental.DisableIngestAsFlushable = func() bool { return true }
|
||||
}
|
||||
var lopts pebble.LevelOptions
|
||||
lopts.BlockRestartInterval = 1 + rng.Intn(64) // 1 - 64
|
||||
lopts.BlockSize = 1 << uint(rng.Intn(24)) // 1 - 16MB
|
||||
lopts.BlockSizeThreshold = 50 + rng.Intn(50) // 50 - 100
|
||||
lopts.IndexBlockSize = 1 << uint(rng.Intn(24)) // 1 - 16MB
|
||||
lopts.TargetFileSize = 1 << uint(rng.Intn(28)) // 1 - 256MB
|
||||
lopts.BlockRestartInterval = 1 + rng.IntN(64) // 1 - 64
|
||||
lopts.BlockSize = 1 << uint(rng.IntN(24)) // 1 - 16MB
|
||||
lopts.BlockSizeThreshold = 50 + rng.IntN(50) // 50 - 100
|
||||
lopts.IndexBlockSize = 1 << uint(rng.IntN(24)) // 1 - 16MB
|
||||
lopts.TargetFileSize = 1 << uint(rng.IntN(28)) // 1 - 256MB
|
||||
|
||||
// We either use no bloom filter, the default filter, or a filter with
|
||||
// randomized bits-per-key setting. We zero out the Filters map. It'll get
|
||||
// repopulated on EnsureDefaults accordingly.
|
||||
opts.Filters = nil
|
||||
switch rng.Intn(3) {
|
||||
switch rng.IntN(3) {
|
||||
case 0:
|
||||
lopts.FilterPolicy = nil
|
||||
case 1:
|
||||
lopts.FilterPolicy = bloom.FilterPolicy(10)
|
||||
default:
|
||||
lopts.FilterPolicy = newTestingFilterPolicy(1 << rng.Intn(5))
|
||||
lopts.FilterPolicy = newTestingFilterPolicy(1 << rng.IntN(5))
|
||||
}
|
||||
|
||||
// We use either no compression, snappy compression or zstd compression.
|
||||
switch rng.Intn(3) {
|
||||
switch rng.IntN(3) {
|
||||
case 0:
|
||||
lopts.Compression = pebble.NoCompression
|
||||
case 1:
|
||||
@ -528,26 +528,26 @@ func randomOptions(
|
||||
// single standard test configuration that uses a disk-backed FS is
|
||||
// sufficient.
|
||||
testOpts.useDisk = false
|
||||
testOpts.strictFS = rng.Intn(2) != 0 // Only relevant for MemFS.
|
||||
testOpts.threads = rng.Intn(runtime.GOMAXPROCS(0)) + 1
|
||||
testOpts.strictFS = rng.IntN(2) != 0 // Only relevant for MemFS.
|
||||
testOpts.threads = rng.IntN(runtime.GOMAXPROCS(0)) + 1
|
||||
if testOpts.strictFS {
|
||||
opts.DisableWAL = false
|
||||
}
|
||||
testOpts.ingestUsingApply = rng.Intn(2) != 0
|
||||
testOpts.deleteSized = rng.Intn(2) != 0
|
||||
testOpts.replaceSingleDelete = rng.Intn(2) != 0
|
||||
testOpts.disableBlockPropertyCollector = rng.Intn(2) == 1
|
||||
testOpts.ingestUsingApply = rng.IntN(2) != 0
|
||||
testOpts.deleteSized = rng.IntN(2) != 0
|
||||
testOpts.replaceSingleDelete = rng.IntN(2) != 0
|
||||
testOpts.disableBlockPropertyCollector = rng.IntN(2) == 1
|
||||
if testOpts.disableBlockPropertyCollector {
|
||||
testOpts.Opts.BlockPropertyCollectors = nil
|
||||
}
|
||||
testOpts.enableValueBlocks = opts.FormatMajorVersion >= pebble.FormatSSTableValueBlocks &&
|
||||
rng.Intn(2) != 0
|
||||
rng.IntN(2) != 0
|
||||
if testOpts.enableValueBlocks {
|
||||
testOpts.Opts.Experimental.EnableValueBlocks = func() bool { return true }
|
||||
}
|
||||
testOpts.asyncApplyToDB = rng.Intn(2) != 0
|
||||
testOpts.asyncApplyToDB = rng.IntN(2) != 0
|
||||
// 20% of time, enable shared storage.
|
||||
if rng.Intn(5) == 0 {
|
||||
if rng.IntN(5) == 0 {
|
||||
testOpts.sharedStorageEnabled = true
|
||||
inMemShared := remote.NewInMem()
|
||||
testOpts.Opts.Experimental.RemoteStorage = remote.MakeSimpleFactory(map[remote.Locator]remote.Storage{
|
||||
@ -556,20 +556,20 @@ func randomOptions(
|
||||
// If shared storage is enabled, pick between writing all files on shared
|
||||
// vs. lower levels only, 50% of the time.
|
||||
testOpts.Opts.Experimental.CreateOnShared = remote.CreateOnSharedAll
|
||||
if rng.Intn(2) == 0 {
|
||||
if rng.IntN(2) == 0 {
|
||||
testOpts.Opts.Experimental.CreateOnShared = remote.CreateOnSharedLower
|
||||
}
|
||||
// If shared storage is enabled, enable secondary cache 50% of time.
|
||||
if rng.Intn(2) == 0 {
|
||||
if rng.IntN(2) == 0 {
|
||||
testOpts.secondaryCacheEnabled = true
|
||||
// TODO(josh): Randomize various secondary cache settings.
|
||||
testOpts.Opts.Experimental.SecondaryCacheSizeBytes = 1024 * 1024 * 32 // 32 MBs
|
||||
}
|
||||
// 50% of the time, enable shared replication.
|
||||
testOpts.useSharedReplicate = rng.Intn(2) == 0
|
||||
testOpts.useSharedReplicate = rng.IntN(2) == 0
|
||||
}
|
||||
testOpts.seedEFOS = rng.Uint64()
|
||||
testOpts.ingestSplit = rng.Intn(2) == 0
|
||||
testOpts.ingestSplit = rng.IntN(2) == 0
|
||||
opts.Experimental.IngestSplit = func() bool { return testOpts.ingestSplit }
|
||||
testOpts.Opts.EnsureDefaults()
|
||||
return testOpts
|
||||
|
||||
@ -7,6 +7,7 @@ package metamorphic
|
||||
import (
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"math/rand/v2"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
@ -19,7 +20,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"github.com/kr/pretty"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func TestSetupInitialState(t *testing.T) {
|
||||
@ -136,7 +136,7 @@ func TestOptionsRoundtrip(t *testing.T) {
|
||||
checkOptions(t, standard[i])
|
||||
})
|
||||
}
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
for i := 0; i < 100; i++ {
|
||||
t.Run(fmt.Sprintf("random-%03d", i), func(t *testing.T) {
|
||||
o := randomOptions(rng, nil)
|
||||
@ -156,7 +156,7 @@ func TestBlockPropertiesParse(t *testing.T) {
|
||||
const numOps = 10_000
|
||||
metaDir := t.TempDir()
|
||||
|
||||
rng := rand.New(rand.NewSource(fixedSeed))
|
||||
rng := rand.New(rand.NewPCG(0, fixedSeed))
|
||||
ops := generate(rng, numOps, presetConfigs[0], newKeyManager(1 /* numInstances */))
|
||||
opsPath := filepath.Join(metaDir, "ops")
|
||||
formattedOps := formatOps(ops)
|
||||
|
||||
@ -6,9 +6,8 @@ package metamorphic
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"sort"
|
||||
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
// objTag identifies the type for an object: DB, Batch, Iter, or Snapshot.
|
||||
@ -77,7 +76,7 @@ func (s *objIDSlice) remove(id objID) {
|
||||
}
|
||||
|
||||
func (s *objIDSlice) rand(rng *rand.Rand) objID {
|
||||
return (*s)[rng.Intn(len(*s))]
|
||||
return (*s)[rng.IntN(len(*s))]
|
||||
}
|
||||
|
||||
// objIDSet is an unordered set of object IDs.
|
||||
|
||||
@ -4,6 +4,7 @@ import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"strconv"
|
||||
"sync"
|
||||
"testing"
|
||||
@ -17,7 +18,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/objstorage/objstorageprovider/sharedcache"
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func TestSharedCache(t *testing.T) {
|
||||
@ -128,7 +128,7 @@ func TestSharedCacheRandomized(t *testing.T) {
|
||||
|
||||
seed := uint64(time.Now().UnixNano())
|
||||
fmt.Printf("seed: %v\n", seed)
|
||||
rand.Seed(seed)
|
||||
rng := rand.New(rand.NewPCG(0, seed))
|
||||
|
||||
helper := func(
|
||||
blockSize int,
|
||||
@ -140,7 +140,7 @@ func TestSharedCacheRandomized(t *testing.T) {
|
||||
if invariants.RaceEnabled {
|
||||
maxShards = 8
|
||||
}
|
||||
numShards := rand.Intn(maxShards) + 1
|
||||
numShards := rng.IntN(maxShards) + 1
|
||||
cacheSize := shardingBlockSize * int64(numShards) // minimum allowed cache size
|
||||
|
||||
cache, err := sharedcache.Open(fs, base.DefaultLogger, "", blockSize, shardingBlockSize, cacheSize, numShards)
|
||||
@ -152,7 +152,7 @@ func TestSharedCacheRandomized(t *testing.T) {
|
||||
|
||||
// With invariants on, Write will modify its input buffer.
|
||||
// If size == 0, we can see panics below, so force a nonzero size.
|
||||
size := rand.Int63n(cacheSize-1) + 1
|
||||
size := rng.Int64N(cacheSize-1) + 1
|
||||
objData := make([]byte, size)
|
||||
wrote := make([]byte, size)
|
||||
for i := 0; i < int(size); i++ {
|
||||
@ -173,7 +173,7 @@ func TestSharedCacheRandomized(t *testing.T) {
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
offset := rand.Int63n(size)
|
||||
offset := rng.Int64N(size)
|
||||
|
||||
got := make([]byte, size-offset)
|
||||
err := cache.ReadAt(ctx, base.FileNum(1).DiskFileNum(), got, offset, readable, readable.Size(), sharedcache.ReadFlags{})
|
||||
@ -186,7 +186,7 @@ func TestSharedCacheRandomized(t *testing.T) {
|
||||
require.Equal(t, objData[int(offset):], got)
|
||||
}()
|
||||
// If concurrent reads, only wait 50% of loop iterations on average.
|
||||
if concurrentReads && rand.Intn(2) == 0 {
|
||||
if concurrentReads && rng.IntN(2) == 0 {
|
||||
wg.Wait()
|
||||
}
|
||||
if !concurrentReads {
|
||||
@ -203,10 +203,10 @@ func TestSharedCacheRandomized(t *testing.T) {
|
||||
|
||||
if !invariants.RaceEnabled {
|
||||
for i := 0; i < 5; i++ {
|
||||
exp := rand.Intn(11) + 10 // [10, 20]
|
||||
exp := rng.IntN(11) + 10 // [10, 20]
|
||||
randomBlockSize := 1 << exp // [1 KB, 1 MB]
|
||||
|
||||
factor := rand.Intn(4) + 1 // [1, 4]
|
||||
factor := rng.IntN(4) + 1 // [1, 4]
|
||||
randomShardingBlockSize := int64(randomBlockSize * factor) // [1 KB, 4 MB]
|
||||
|
||||
t.Run("random block and sharding block size", helper(randomBlockSize, randomShardingBlockSize))
|
||||
|
||||
@ -7,6 +7,7 @@ package pebble
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"runtime"
|
||||
"strings"
|
||||
"sync"
|
||||
@ -20,7 +21,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/sstable"
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func TestRangeDel(t *testing.T) {
|
||||
@ -189,12 +189,12 @@ func TestFlushDelay(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestFlushDelayStress(t *testing.T) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
opts := &Options{
|
||||
FS: vfs.NewMem(),
|
||||
Comparer: testkeys.Comparer,
|
||||
FlushDelayDeleteRange: time.Duration(rng.Intn(10)+1) * time.Millisecond,
|
||||
FlushDelayRangeKey: time.Duration(rng.Intn(10)+1) * time.Millisecond,
|
||||
FlushDelayDeleteRange: time.Duration(rng.IntN(10)+1) * time.Millisecond,
|
||||
FlushDelayRangeKey: time.Duration(rng.IntN(10)+1) * time.Millisecond,
|
||||
FormatMajorVersion: internalFormatNewest,
|
||||
MemTableSize: 8192,
|
||||
}
|
||||
@ -209,14 +209,14 @@ func TestFlushDelayStress(t *testing.T) {
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(writers)
|
||||
for i := 0; i < writers; i++ {
|
||||
rng := rand.New(rand.NewSource(uint64(now) + uint64(i)))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(now)+uint64(i)))
|
||||
go func() {
|
||||
const ops = 100
|
||||
defer wg.Done()
|
||||
|
||||
var k1, k2 [32]byte
|
||||
for j := 0; j < ops; j++ {
|
||||
switch rng.Intn(3) {
|
||||
switch rng.IntN(3) {
|
||||
case 0:
|
||||
randStr(k1[:], rng)
|
||||
randStr(k2[:], rng)
|
||||
@ -236,7 +236,7 @@ func TestFlushDelayStress(t *testing.T) {
|
||||
}()
|
||||
}
|
||||
wg.Wait()
|
||||
time.Sleep(time.Duration(rng.Intn(10)+1) * time.Millisecond)
|
||||
time.Sleep(time.Duration(rng.IntN(10)+1) * time.Millisecond)
|
||||
require.NoError(t, d.Close())
|
||||
}
|
||||
}
|
||||
|
||||
@ -6,11 +6,11 @@ package pebble
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func BenchmarkReadState(b *testing.B) {
|
||||
@ -24,7 +24,7 @@ func BenchmarkReadState(b *testing.B) {
|
||||
for _, updateFrac := range []float32{0, 0.1, 0.5} {
|
||||
b.Run(fmt.Sprintf("updates=%.0f", updateFrac*100), func(b *testing.B) {
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
for pb.Next() {
|
||||
if rng.Float32() < updateFrac {
|
||||
|
||||
@ -10,6 +10,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"math/rand/v2"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
@ -18,7 +19,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/internal/base"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func short(s string) string {
|
||||
@ -134,14 +134,14 @@ func TestRandom(t *testing.T) {
|
||||
r *rand.Rand
|
||||
)
|
||||
reset := func() {
|
||||
i, r = 0, rand.New(rand.NewSource(0))
|
||||
i, r = 0, rand.New(rand.NewPCG(0, 0))
|
||||
}
|
||||
gen := func() (string, bool) {
|
||||
if i == n {
|
||||
return "", false
|
||||
}
|
||||
i++
|
||||
return strings.Repeat(string(uint8(i)), r.Intn(2*blockSize+16)), true
|
||||
return strings.Repeat(string(uint8(i)), r.IntN(2*blockSize+16)), true
|
||||
}
|
||||
testGenerator(t, reset, gen)
|
||||
}
|
||||
@ -231,11 +231,11 @@ func TestNonExhaustiveRead(t *testing.T) {
|
||||
const n = 100
|
||||
buf := new(bytes.Buffer)
|
||||
p := make([]byte, 10)
|
||||
rnd := rand.New(rand.NewSource(1))
|
||||
rnd := rand.New(rand.NewPCG(0, 1))
|
||||
|
||||
w := NewWriter(buf)
|
||||
for i := 0; i < n; i++ {
|
||||
length := len(p) + rnd.Intn(3*blockSize)
|
||||
length := len(p) + rnd.IntN(3*blockSize)
|
||||
s := string(uint8(i)) + "123456789abcdefgh"
|
||||
_, _ = w.WriteRecord([]byte(big(s, length)))
|
||||
}
|
||||
@ -839,7 +839,7 @@ func TestSize(t *testing.T) {
|
||||
zeroes := make([]byte, 8<<10)
|
||||
w := NewWriter(&buf)
|
||||
for i := 0; i < 100; i++ {
|
||||
n := rand.Intn(len(zeroes))
|
||||
n := rand.IntN(len(zeroes))
|
||||
_, err := w.WriteRecord(zeroes[:n])
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, w.Flush())
|
||||
@ -867,9 +867,9 @@ func TestRecycleLog(t *testing.T) {
|
||||
const min = 16
|
||||
const max = 4096
|
||||
|
||||
rnd := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rnd := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
randBlock := func() []byte {
|
||||
data := make([]byte, rand.Intn(max-min)+min)
|
||||
data := make([]byte, rand.IntN(max-min)+min)
|
||||
tmp := data
|
||||
for len(tmp) >= 8 {
|
||||
binary.LittleEndian.PutUint64(tmp, rand.Uint64())
|
||||
@ -887,7 +887,7 @@ func TestRecycleLog(t *testing.T) {
|
||||
// with random data.
|
||||
backing := make([]byte, 1<<20)
|
||||
for i := 1; i <= 100; i++ {
|
||||
blocks := rnd.Intn(100)
|
||||
blocks := rnd.IntN(100)
|
||||
limitedBuf := &limitedWriter{
|
||||
Writer: bytes.NewBuffer(backing[:0]),
|
||||
limit: blocks,
|
||||
@ -895,7 +895,7 @@ func TestRecycleLog(t *testing.T) {
|
||||
|
||||
w := NewLogWriter(limitedBuf, base.DiskFileNum(i), LogWriterConfig{
|
||||
WALFsyncLatency: prometheus.NewHistogram(prometheus.HistogramOpts{})})
|
||||
sizes := make([]int, 10+rnd.Intn(100))
|
||||
sizes := make([]int, 10+rnd.IntN(100))
|
||||
for j := range sizes {
|
||||
data := randBlock()
|
||||
if _, err := w.WriteRecord(data); err != nil {
|
||||
|
||||
@ -313,8 +313,8 @@ func order2CmpFunc[E any](data []E, a, b int, swaps *int, cmp func(a, b E) int)
|
||||
// medianCmpFunc returns x where data[x] is the median of data[a],data[b],data[c], where x is a, b, or c.
|
||||
func medianCmpFunc[E any](data []E, a, b, c int, swaps *int, cmp func(a, b E) int) int {
|
||||
a, b = order2CmpFunc(data, a, b, swaps, cmp)
|
||||
b, c = order2CmpFunc(data, b, c, swaps, cmp)
|
||||
a, b = order2CmpFunc(data, a, b, swaps, cmp)
|
||||
b, _ = order2CmpFunc(data, b, c, swaps, cmp)
|
||||
_, b = order2CmpFunc(data, a, b, swaps, cmp)
|
||||
return b
|
||||
}
|
||||
|
||||
|
||||
@ -313,8 +313,8 @@ func order2Ordered[E cmp.Ordered](data []E, a, b int, swaps *int) (int, int) {
|
||||
// medianOrdered returns x where data[x] is the median of data[a],data[b],data[c], where x is a, b, or c.
|
||||
func medianOrdered[E cmp.Ordered](data []E, a, b, c int, swaps *int) int {
|
||||
a, b = order2Ordered(data, a, b, swaps)
|
||||
b, c = order2Ordered(data, b, c, swaps)
|
||||
a, b = order2Ordered(data, a, b, swaps)
|
||||
b, _ = order2Ordered(data, b, c, swaps)
|
||||
_, b = order2Ordered(data, a, b, swaps)
|
||||
return b
|
||||
}
|
||||
|
||||
|
||||
@ -7,6 +7,7 @@ package sstable
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"math/rand/v2"
|
||||
"strconv"
|
||||
"strings"
|
||||
"testing"
|
||||
@ -17,7 +18,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/internal/base"
|
||||
"github.com/cockroachdb/pebble/internal/itertest"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func ikey(s string) InternalKey {
|
||||
@ -380,11 +380,11 @@ func BenchmarkBlockIterSeekGE(b *testing.B) {
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
k := keys[rng.Intn(len(keys))]
|
||||
k := keys[rng.IntN(len(keys))]
|
||||
it.SeekGE(k, base.SeekGEFlagsNone)
|
||||
if testing.Verbose() {
|
||||
if !it.valid() {
|
||||
@ -422,11 +422,11 @@ func BenchmarkBlockIterSeekLT(b *testing.B) {
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
j := rng.Intn(len(keys))
|
||||
j := rng.IntN(len(keys))
|
||||
it.SeekLT(keys[j], base.SeekLTFlagsNone)
|
||||
if testing.Verbose() {
|
||||
if j == 0 {
|
||||
|
||||
@ -11,6 +11,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"math/rand/v2"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
@ -31,7 +32,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"github.com/cockroachdb/pebble/vfs/errorfs"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
// get is a testing helper that simulates a read and helps verify bloom filters
|
||||
@ -1197,7 +1197,7 @@ func TestReaderChecksumErrors(t *testing.T) {
|
||||
|
||||
func TestValidateBlockChecksums(t *testing.T) {
|
||||
seed := uint64(time.Now().UnixNano())
|
||||
rng := rand.New(rand.NewSource(seed))
|
||||
rng := rand.New(rand.NewPCG(0, seed))
|
||||
t.Logf("using seed = %d", seed)
|
||||
|
||||
allFiles := []string{
|
||||
@ -1332,9 +1332,9 @@ func TestValidateBlockChecksums(t *testing.T) {
|
||||
var bh BlockHandle
|
||||
switch location {
|
||||
case corruptionLocationData:
|
||||
bh = layout.Data[rng.Intn(len(layout.Data))].BlockHandle
|
||||
bh = layout.Data[rng.IntN(len(layout.Data))].BlockHandle
|
||||
case corruptionLocationIndex:
|
||||
bh = layout.Index[rng.Intn(len(layout.Index))]
|
||||
bh = layout.Index[rng.IntN(len(layout.Index))]
|
||||
case corruptionLocationTopIndex:
|
||||
bh = layout.TopIndex
|
||||
case corruptionLocationFilter:
|
||||
@ -1350,7 +1350,7 @@ func TestValidateBlockChecksums(t *testing.T) {
|
||||
}
|
||||
|
||||
// Corrupt a random byte within the selected block.
|
||||
pos := int64(bh.Offset) + rng.Int63n(int64(bh.Length))
|
||||
pos := int64(bh.Offset) + rng.Int64N(int64(bh.Length))
|
||||
t.Logf("altering file=%s @ offset = %d", file, pos)
|
||||
|
||||
b := make([]byte, 1)
|
||||
@ -1546,11 +1546,11 @@ func BenchmarkTableIterSeekGE(b *testing.B) {
|
||||
r, keys := buildBenchmarkTable(b, bm.options, false, 0)
|
||||
it, err := r.NewIter(nil /* lower */, nil /* upper */)
|
||||
require.NoError(b, err)
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
it.SeekGE(keys[rng.Intn(len(keys))], base.SeekGEFlagsNone)
|
||||
it.SeekGE(keys[rng.IntN(len(keys))], base.SeekGEFlagsNone)
|
||||
}
|
||||
|
||||
b.StopTimer()
|
||||
@ -1567,11 +1567,11 @@ func BenchmarkTableIterSeekLT(b *testing.B) {
|
||||
r, keys := buildBenchmarkTable(b, bm.options, false, 0)
|
||||
it, err := r.NewIter(nil /* lower */, nil /* upper */)
|
||||
require.NoError(b, err)
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
it.SeekLT(keys[rng.Intn(len(keys))], base.SeekLTFlagsNone)
|
||||
it.SeekLT(keys[rng.IntN(len(keys))], base.SeekLTFlagsNone)
|
||||
}
|
||||
|
||||
b.StopTimer()
|
||||
@ -1766,12 +1766,14 @@ func BenchmarkIteratorScanManyVersions(b *testing.B) {
|
||||
options.TableFormat = tableFormat
|
||||
w := NewWriter(objstorageprovider.NewFileWritable(f0), options)
|
||||
val := make([]byte, 100)
|
||||
rng := rand.New(rand.NewSource(100))
|
||||
rng := rand.New(rand.NewPCG(0, 100))
|
||||
for i := int64(0); i < keys.Count(); i++ {
|
||||
for v := 0; v < versionCount; v++ {
|
||||
n := testkeys.WriteKeyAt(keyBuf[sharedPrefixLen:], keys, i, int64(versionCount-v+1))
|
||||
key := keyBuf[:n+sharedPrefixLen]
|
||||
rng.Read(val)
|
||||
for j := range val {
|
||||
val[j] = byte(rng.Uint32())
|
||||
}
|
||||
require.NoError(b, w.Set(key, val))
|
||||
}
|
||||
}
|
||||
@ -1846,7 +1848,10 @@ func BenchmarkIteratorScanNextPrefix(b *testing.B) {
|
||||
const sharedPrefixLen = 32
|
||||
const unsharedPrefixLen = 8
|
||||
val := make([]byte, 100)
|
||||
rand.New(rand.NewSource(100)).Read(val)
|
||||
rng := rand.New(rand.NewPCG(0, 100))
|
||||
for j := range val {
|
||||
val[j] = byte(rng.Uint32())
|
||||
}
|
||||
|
||||
// Take the very large keyspace consisting of alphabetic characters of
|
||||
// lengths up to unsharedPrefixLen and reduce it down to keyCount keys by
|
||||
@ -2027,11 +2032,13 @@ func BenchmarkIteratorScanObsolete(b *testing.B) {
|
||||
options.TableFormat = tableFormat
|
||||
w := NewWriter(objstorageprovider.NewFileWritable(f0), options)
|
||||
val := make([]byte, 100)
|
||||
rng := rand.New(rand.NewSource(100))
|
||||
rng := rand.New(rand.NewPCG(0, 100))
|
||||
for i := int64(0); i < keys.Count(); i++ {
|
||||
n := testkeys.WriteKey(keyBuf, keys, i)
|
||||
key := keyBuf[:n]
|
||||
rng.Read(val)
|
||||
for j := range val {
|
||||
val[j] = byte(rng.Uint32())
|
||||
}
|
||||
forceObsolete := true
|
||||
if i == 0 {
|
||||
forceObsolete = false
|
||||
|
||||
@ -501,7 +501,7 @@ func RewriteKeySuffixesViaWriter(
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if w.addPoint(scratch, val, false); err != nil {
|
||||
if err = w.addPoint(scratch, val, false); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
k, v = i.Next()
|
||||
|
||||
@ -12,6 +12,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"math/rand/v2"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
@ -26,7 +27,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"github.com/kr/pretty"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
// nonsenseWords are words that aren't in testdata/h.txt.
|
||||
@ -252,16 +252,16 @@ func check(f vfs.File, comparer *Comparer, fp FilterPolicy) error {
|
||||
|
||||
// Check lower/upper bounds behavior. Randomly choose a lower and upper bound
|
||||
// and then guarantee that iteration finds the expected number if entries.
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
sort.Strings(words)
|
||||
for i := 0; i < 10; i++ {
|
||||
lowerIdx := -1
|
||||
upperIdx := len(words)
|
||||
if rng.Intn(5) != 0 {
|
||||
lowerIdx = rng.Intn(len(words))
|
||||
if rng.IntN(5) != 0 {
|
||||
lowerIdx = rng.IntN(len(words))
|
||||
}
|
||||
if rng.Intn(5) != 0 {
|
||||
upperIdx = rng.Intn(len(words))
|
||||
if rng.IntN(5) != 0 {
|
||||
upperIdx = rng.IntN(len(words))
|
||||
}
|
||||
if lowerIdx > upperIdx {
|
||||
lowerIdx, upperIdx = upperIdx, lowerIdx
|
||||
|
||||
@ -8,12 +8,12 @@ import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand/v2"
|
||||
"testing"
|
||||
"time"
|
||||
"unsafe"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
func TestGetBytes(t *testing.T) {
|
||||
@ -50,7 +50,7 @@ func TestDecodeVarint(t *testing.T) {
|
||||
}
|
||||
|
||||
func BenchmarkDecodeVarint(b *testing.B) {
|
||||
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
|
||||
rng := rand.New(rand.NewPCG(0, uint64(time.Now().UnixNano())))
|
||||
vals := make([]unsafe.Pointer, 10000)
|
||||
for i := range vals {
|
||||
buf := make([]byte, 5)
|
||||
|
||||
@ -8,6 +8,7 @@ import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"io"
|
||||
"math/rand/v2"
|
||||
"sync"
|
||||
"unsafe"
|
||||
|
||||
@ -15,7 +16,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/internal/base"
|
||||
"github.com/cockroachdb/pebble/internal/invariants"
|
||||
"github.com/cockroachdb/pebble/objstorage/objstorageprovider/objiotracing"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
// Value blocks are supported in TableFormatPebblev3.
|
||||
@ -445,7 +445,9 @@ func releaseToValueBlockBufPool(pool *sync.Pool, b *blockBuffer) {
|
||||
length = 1000
|
||||
}
|
||||
b.b = b.b[:length:length]
|
||||
rand.Read(b.b)
|
||||
for j := range b.b {
|
||||
b.b[j] = byte(rand.Uint32())
|
||||
}
|
||||
}
|
||||
pool.Put(b)
|
||||
}
|
||||
@ -889,7 +891,7 @@ func (r *valueBlockReader) doValueMangling(v []byte) []byte {
|
||||
// Randomly set the bytes in the previous retrieved value to 0, since
|
||||
// property P1 only requires the valueBlockReader to maintain the memory of
|
||||
// one fetched value.
|
||||
if rand.Intn(2) == 0 {
|
||||
if rand.IntN(2) == 0 {
|
||||
for i := range r.bufToMangle {
|
||||
r.bufToMangle[i] = 0
|
||||
}
|
||||
|
||||
@ -224,9 +224,7 @@ func runDataDriven(t *testing.T, file string, tableFormat TableFormat, paralleli
|
||||
if err != nil {
|
||||
return err.Error()
|
||||
}
|
||||
if err != nil {
|
||||
return err.Error()
|
||||
}
|
||||
|
||||
return format(td, meta)
|
||||
|
||||
default:
|
||||
|
||||
@ -10,6 +10,7 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand/v2"
|
||||
"os"
|
||||
"path"
|
||||
"strconv"
|
||||
@ -28,7 +29,6 @@ import (
|
||||
"github.com/cockroachdb/pebble/sstable"
|
||||
"github.com/cockroachdb/pebble/vfs"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
type tableCacheTestFile struct {
|
||||
@ -240,7 +240,7 @@ func TestTableCacheRefs(t *testing.T) {
|
||||
if fmt.Sprint(r) != "pebble: inconsistent reference count: -1" {
|
||||
t.Fatalf("unexpected panic message")
|
||||
}
|
||||
} else if r == nil {
|
||||
} else {
|
||||
t.Fatalf("expected panic")
|
||||
}
|
||||
}()
|
||||
@ -428,7 +428,7 @@ func TestSharedTableCacheUseAfterAllFree(t *testing.T) {
|
||||
if fmt.Sprint(r) != "pebble: inconsistent reference count: 1" {
|
||||
t.Fatalf("unexpected panic message")
|
||||
}
|
||||
} else if r == nil {
|
||||
} else {
|
||||
t.Fatalf("expected panic")
|
||||
}
|
||||
}()
|
||||
@ -589,13 +589,13 @@ func testTableCacheRandomAccess(t *testing.T, concurrent bool) {
|
||||
require.NoError(t, err)
|
||||
|
||||
rngMu := sync.Mutex{}
|
||||
rng := rand.New(rand.NewSource(1))
|
||||
rng := rand.New(rand.NewPCG(0, 1))
|
||||
|
||||
errc := make(chan error, N)
|
||||
for i := 0; i < N; i++ {
|
||||
go func(i int) {
|
||||
rngMu.Lock()
|
||||
fileNum, sleepTime := rng.Intn(tableCacheTestNumTables), rng.Intn(1000)
|
||||
fileNum, sleepTime := rng.IntN(tableCacheTestNumTables), rng.IntN(1000)
|
||||
rngMu.Unlock()
|
||||
m := &fileMetadata{FileNum: FileNum(fileNum)}
|
||||
m.InitPhysicalBacking()
|
||||
@ -758,9 +758,9 @@ func testTableCacheEvictionsInternal(t *testing.T, rangeIter bool) {
|
||||
c, fs, err := newTableCacheContainerTest(nil, "")
|
||||
require.NoError(t, err)
|
||||
|
||||
rng := rand.New(rand.NewSource(2))
|
||||
rng := rand.New(rand.NewPCG(0, 2))
|
||||
for i := 0; i < N; i++ {
|
||||
j := rng.Intn(tableCacheTestNumTables)
|
||||
j := rng.IntN(tableCacheTestNumTables)
|
||||
var iter io.Closer
|
||||
var err error
|
||||
m := &fileMetadata{FileNum: FileNum(j)}
|
||||
@ -778,7 +778,7 @@ func testTableCacheEvictionsInternal(t *testing.T, rangeIter bool) {
|
||||
t.Fatalf("i=%d, j=%d: close: %v", i, j, err)
|
||||
}
|
||||
|
||||
c.evict(base.FileNum(lo + rng.Uint64n(hi-lo)).DiskFileNum())
|
||||
c.evict(base.FileNum(lo + rng.Uint64N(hi-lo)).DiskFileNum())
|
||||
}
|
||||
|
||||
sumEvicted, nEvicted := 0, 0
|
||||
@ -825,9 +825,9 @@ func TestSharedTableCacheEvictions(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
tc.Unref()
|
||||
|
||||
rng := rand.New(rand.NewSource(2))
|
||||
rng := rand.New(rand.NewPCG(0, 2))
|
||||
for i := 0; i < N; i++ {
|
||||
j := rng.Intn(tableCacheTestNumTables)
|
||||
j := rng.IntN(tableCacheTestNumTables)
|
||||
m := &fileMetadata{FileNum: FileNum(j)}
|
||||
m.InitPhysicalBacking()
|
||||
m.Ref()
|
||||
@ -849,8 +849,8 @@ func TestSharedTableCacheEvictions(t *testing.T) {
|
||||
t.Fatalf("i=%d, j=%d: close: %v", i, j, err)
|
||||
}
|
||||
|
||||
c1.evict(base.FileNum(lo + rng.Uint64n(hi-lo)).DiskFileNum())
|
||||
c2.evict(base.FileNum(lo + rng.Uint64n(hi-lo)).DiskFileNum())
|
||||
c1.evict(base.FileNum(lo + rng.Uint64N(hi-lo)).DiskFileNum())
|
||||
c2.evict(base.FileNum(lo + rng.Uint64N(hi-lo)).DiskFileNum())
|
||||
}
|
||||
|
||||
check := func(fs *tableCacheTestFS, c *tableCacheContainer) (float64, float64, float64) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user