diff --git a/.evergreen/config.yml b/.evergreen/config.yml index 91049cf4d4..405705850a 100644 --- a/.evergreen/config.yml +++ b/.evergreen/config.yml @@ -680,9 +680,11 @@ tasks: commands: - func: bootstrap-mongo-orchestration vars: + VERSION: "v6.0-perf" TOPOLOGY: "server" AUTH: "noauth" SSL: "nossl" + SKIP_LEGACY_SHELL: "true" - func: run-task vars: targets: driver-benchmark @@ -2172,8 +2174,7 @@ buildvariants: - name: perf display_name: "Performance" - run_on: - - rhel8.7-large + run_on: rhel90-dbx-perf-large expansions: GO_DIST: "/opt/golang/go1.22" tasks: diff --git a/.gitignore b/.gitignore index c024a44d76..ef128dd7ff 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,8 @@ debug *.sublime-workspace driver-test-data.tar.gz perf +perf.json +perf.suite **mongocryptd.pid *.test .DS_Store diff --git a/Taskfile.yml b/Taskfile.yml index 76c89600e1..843023669e 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -190,16 +190,10 @@ tasks: - go test ${BUILD_TAGS} -benchmem -bench=. ./benchmark | test benchmark.suite driver-benchmark: - deps: [perf-files] cmds: - - go run ./internal/cmd/benchmark | tee perf.suite + - go test ./internal/cmd/benchmark -v --fullRun | tee perf.suite ### Internal tasks. ### - perf-files: - internal: true - cmds: - - bash etc/prep-perf.sh - install-lll: internal: true cmds: diff --git a/etc/prep-perf.sh b/etc/prep-perf.sh deleted file mode 100755 index 6ec31d6e4d..0000000000 --- a/etc/prep-perf.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# Prepares perf data. -set -eux - -if [ -d /testdata/perf/ ]; then - echo "/testdata/perf/ already exists, skipping download" - exit 0 -fi - -curl --retry 5 "https://s3.amazonaws.com/boxes.10gen.com/build/driver-test-data.tar.gz" -o driver-test-data.tar.gz --silent --max-time 120 - -if [ "$(uname -s)" == "Darwin" ]; then - tar -zxf driver-test-data.tar.gz -s /testdata/perf/ -else - tar -zxf driver-test-data.tar.gz --transform=s/testdata/perf/ -fi diff --git a/internal/cmd/benchmark/benchmark_test.go b/internal/cmd/benchmark/benchmark_test.go new file mode 100644 index 0000000000..6dd887f9f2 --- /dev/null +++ b/internal/cmd/benchmark/benchmark_test.go @@ -0,0 +1,612 @@ +// Copyright (C) MongoDB, Inc. 2024-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package main + +import ( + "archive/tar" + "compress/gzip" + "context" + "encoding/json" + "errors" + "flag" + "fmt" + "io" + "net/http" + "os" + "path/filepath" + "sort" + "strings" + "testing" + "time" + + "github.com/evergreen-ci/poplar" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" +) + +const ( + defaultOutputFileName = "perf.json" + legacyHelloLowercase = "ismaster" + tarFile = "perf.tar.gz" + perfDir = "perf" + testdataURL = "https://s3.amazonaws.com/boxes.10gen.com/build/driver-test-data.tar.gz" + perftestDB = "perftest" + corpusColl = "corpus" + bsonDataDir = "extended_bson" + + // Bson test data + flatBSONData = "flat_bson.json" + deepBSONData = "deep_bson.json" + fullBSONData = "full_bson.json" + + // Single test data + singleAndMultiDataDir = "single_and_multi_document" + tweetData = "tweet.json" + smallData = "small_doc.json" + largeData = "large_doc.json" + + // Reusable metric names + opsPerSecondMaxName = "ops_per_second_max" + opsPerSecondMinName = "ops_per_second_min" + opsPerSecondMedName = "ops_per_second_med" +) + +// fullRun will run all of the tests. This is default to false, since it's +// unlikely a user would need to run all tests locally. We still need to run +// the test up to the point where the performance data is downloaded. +var fullRun bool + +func init() { + flag.BoolVar(&fullRun, "fullRun", false, "run all benchmarks in TestRunAllBenchmarks") +} + +type metrics struct { + opsPerSecond []float64 +} + +func recordMetrics(b *testing.B, throughput *metrics, fn func(*testing.B)) { + b.Helper() + + start := time.Now() + + fn(b) + + duration := time.Since(start) + throughput.opsPerSecond = append(throughput.opsPerSecond, 1/duration.Seconds()) +} + +// calculate min, max, and median operations per second and report the metric +// on the benchmark object. +func reportThroughputStats(b *testing.B, times []float64) { + sort.Float64s(times) + + b.ReportMetric(times[0], opsPerSecondMinName) + b.ReportMetric(times[len(times)-1], opsPerSecondMaxName) + + var median float64 + if len(times)%2 == 0 { + median = (times[len(times)/2-1] + times[len(times)/2]) / 2 + } else { + median = times[len(times)/2] + } + + b.ReportMetric(median, opsPerSecondMedName) +} + +func reportMetrics(b *testing.B, metrics *metrics) { + b.Helper() + + reportThroughputStats(b, metrics.opsPerSecond) +} + +// find the testdata directory. We do this instead of hardcoding a relative path +// (i.e. ../../../testdata) so that these benchmarks can be run from both the +// root as a taskfile as well as from the benchmark directory. +func testdataDir(tb testing.TB) string { + tb.Helper() + + wd, err := os.Getwd() + require.NoError(tb, err, "failed to source working directory") + + for { + tdPath := filepath.Join(wd, "testdata") + if _, err := os.Stat(tdPath); !os.IsNotExist(err) { + return tdPath + } + + wd = filepath.Dir(wd) + if filepath.Base(wd) == "mongodb-go-driver" { + tb.Fatal("'testdata' directory not found") + } + } +} + +// where to download the tarball +func testdataTarFileName(tb testing.TB) string { + return filepath.Join(testdataDir(tb), tarFile) +} + +// where to extract the tarball +func testdataPerfDir(tb testing.TB) string { + return filepath.Join(testdataDir(tb), perfDir) +} + +// download the tarball of test data to testdata/perf +func downloadTestDataTgz(t *testing.T) { + resp, err := http.Get(testdataURL) + require.NoError(t, err, "failed to get response from %q", testdataURL) + + defer resp.Body.Close() + + out, err := os.Create(testdataTarFileName(t)) + require.NoError(t, err, "failed to open testdata perf dir") + + defer out.Close() + + _, err = io.Copy(out, resp.Body) + require.NoError(t, err, "failed to copy response body to testdata perf dir") +} + +// extract the tarball to the perf dir. +func extractTestDataTgz(t *testing.T) { + tarPath := testdataTarFileName(t) + defer func() { _ = os.Remove(tarPath) }() + + file, err := os.Open(tarPath) + require.NoError(t, err, "failed to open tar file") + + defer file.Close() + + gzipReader, err := gzip.NewReader(file) + require.NoError(t, err, "failed to create a gzip reader") + + defer gzipReader.Close() + + tarReader := tar.NewReader(gzipReader) + for { + header, err := tarReader.Next() + if errors.Is(err, io.EOF) { + break + } + + require.NoError(t, err, "failed to advance tar entry") + + targetPath := filepath.Join(testdataPerfDir(t), strings.TrimPrefix(header.Name, "data/")) + + switch header.Typeflag { + case tar.TypeDir: + err := os.MkdirAll(targetPath, 0755) + require.NoError(t, err, "failed to extract dir from tgz") + case tar.TypeReg: + outFile, err := os.Create(targetPath) + require.NoError(t, err, "failed to create path to extract file from tgz") + + _, err = io.Copy(outFile, tarReader) + require.NoError(t, err, "failed to extract file from tgz") + + outFile.Close() + } + } +} + +func loadSourceDocument(b *testing.B, canonicalOnly bool, pathParts ...string) bson.D { + b.Helper() + + data, err := os.ReadFile(filepath.Join(pathParts...)) + require.NoError(b, err, "failed to load source document") + + var doc bson.D + + err = bson.UnmarshalExtJSON(data, canonicalOnly, &doc) + require.NoError(b, err, "failed to unmarshal source document") + + require.NotEmpty(b, doc) + + return doc +} + +func benchmarkBSONEncoding(b *testing.B, canonicalOnly bool, source string) { + doc := loadSourceDocument(b, canonicalOnly, testdataPerfDir(b), bsonDataDir, source) + + b.ResetTimer() + + metrics := new(metrics) + + for i := 0; i < b.N; i++ { + recordMetrics(b, metrics, func(b *testing.B) { + out, err := bson.Marshal(doc) + require.NoError(b, err, "failed to encode flat bson data") + + require.NotEmpty(b, out) + }) + } + + reportMetrics(b, metrics) +} + +func benchmarkBSONDecoding(b *testing.B, canonicalOnly bool, source string) { + doc := loadSourceDocument(b, canonicalOnly, testdataPerfDir(b), bsonDataDir, source) + + raw, err := bson.Marshal(doc) + require.NoError(b, err, "failed to encode bson data") + + b.ResetTimer() + + metrics := new(metrics) + + for i := 0; i < b.N; i++ { + recordMetrics(b, metrics, func(b *testing.B) { + var out bson.D + + err := bson.Unmarshal(raw, &out) + require.NoError(b, err, "failed to encode flat bson data") + }) + } + + reportMetrics(b, metrics) +} + +// Test driver performance encoding documents with top level key/value pairs +// involving the most commonly-used BSON types. +func BenchmarkBSONFlatDocumentEncoding(b *testing.B) { + benchmarkBSONEncoding(b, true, flatBSONData) +} + +// Test driver performance decoding documents with top level key/value pairs +// involving the most commonly-used BSON types. +func BenchmarkBSONFlatDocumentDecoding(b *testing.B) { + benchmarkBSONDecoding(b, true, flatBSONData) +} + +// Test driver performance encoding documents with deeply nested key/value pairs +// involving subdocuments, strings, integers, doubles and booleans. +func BenchmarkBSONDeepDocumentEncoding(b *testing.B) { + benchmarkBSONEncoding(b, true, deepBSONData) +} + +// Test driver performance decoding documents with deeply nested key/value pairs +// involving subdocuments, strings, integers, doubles and booleans. +func BenchmarkBSONDeepDocumentDecoding(b *testing.B) { + benchmarkBSONDecoding(b, true, deepBSONData) +} + +// Test driver performance encoding documents with top level key/value pairs +// involving the full range of BSON types. +func BenchmarkBSONFullDocumentEncoding(b *testing.B) { + benchmarkBSONEncoding(b, false, fullBSONData) +} + +// Test driver performance decoding documents with top level key/value pairs +// involving the full range of BSON types. +func BenchmarkBSONFullDocumentDecoding(b *testing.B) { + benchmarkBSONDecoding(b, false, fullBSONData) +} + +// Test driver performance sending a command to the database and reading a +// response. +func BenchmarkSingleRunCommand(b *testing.B) { + coll, teardown := setupBench(b) + defer teardown(b) + + cmd := bson.D{{Key: legacyHelloLowercase, Value: true}} + + metrics := new(metrics) + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + recordMetrics(b, metrics, func(b *testing.B) { + b.Helper() + + var doc bson.D + err := coll.Database().RunCommand(context.Background(), cmd).Decode(&doc) + require.NoError(b, err) + + // read the document and then throw it away to prevent + out, err := bson.Marshal(doc) + require.NoError(b, err) + + require.NotEmpty(b, out) + }) + } + + reportMetrics(b, metrics) +} + +func setupBench(b *testing.B) (*mongo.Collection, func(b *testing.B)) { + b.Helper() + + client, err := mongo.Connect() + require.NoError(b, err, "failed to connect to server") + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + + err = client.Ping(ctx, nil) + require.NoError(b, err, "failed to ping the server") + + ctx, cancel = context.WithCancel(context.Background()) + defer cancel() + + db := client.Database(perftestDB) + + err = db.Drop(ctx) + require.NoError(b, err, "failed to drop %q database", perftestDB) + + err = db.Collection(corpusColl).Drop(ctx) + require.NoError(b, err, "failed to drop %q", corpusColl) + + err = db.CreateCollection(ctx, corpusColl) + require.NoError(b, err, "failed to create %q collection", corpusColl) + + coll := db.Collection(corpusColl) + + return coll, func(b *testing.B) { + err := client.Disconnect(context.Background()) + require.NoError(b, err, "failed to disconnect client") + } +} + +// Test driver performance sending an indexed query to the database and reading +// a single document in response. +func BenchmarkSingleFindOneByID(b *testing.B) { + coll, teardown := setupBench(b) + defer teardown(b) + + doc := loadSourceDocument(b, true, testdataPerfDir(b), singleAndMultiDataDir, tweetData) + + // Insert 10_000 documents into the corpus. + const docCount = 10_000 + + docsToInsert := make([]bson.D, docCount) + for i := range docsToInsert { + docsToInsert[i] = make(bson.D, 0, len(doc)+1) + docsToInsert[i] = append(docsToInsert[i], bson.E{Key: "_id", Value: i}) + docsToInsert[i] = append(docsToInsert[i], doc...) + } + + _, err := coll.InsertMany(context.Background(), docsToInsert) + require.NoError(b, err, "failed to insert corpus") + + metrics := new(metrics) + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + recordMetrics(b, metrics, func(b *testing.B) { + err := coll.FindOne(context.Background(), bson.D{{Key: "_id", Value: i % docCount}}).Decode(&bson.D{}) + require.NoError(b, err, "failed to find one") + }) + } + + reportMetrics(b, metrics) +} + +func benchmarkSingleInsert(b *testing.B, source string) { + b.Helper() + + coll, teardown := setupBench(b) + defer teardown(b) + + doc := loadSourceDocument(b, true, testdataPerfDir(b), singleAndMultiDataDir, smallData) + + metrics := new(metrics) + + for i := 0; i < b.N; i++ { + recordMetrics(b, metrics, func(b *testing.B) { + b.Helper() + _, err := coll.InsertOne(context.Background(), doc) + require.NoError(b, err, "failed to insert small doc") + }) + } + + reportMetrics(b, metrics) +} + +// Test driver performance inserting a single, small document to the database. +func BenchmarkSmallDocInsertOne(b *testing.B) { + benchmarkSingleInsert(b, smallData) +} + +// Test driver performance inserting a single, large document to the database. +func BenchmarkLargeDocInsertOne(b *testing.B) { + benchmarkSingleInsert(b, largeData) +} + +// Test driver performance retrieving multiple documents from a query. +func BenchmarkMultiFindMany(b *testing.B) { + coll, teardown := setupBench(b) + defer teardown(b) + + doc := loadSourceDocument(b, true, testdataPerfDir(b), singleAndMultiDataDir, tweetData) + + docsToInsert := make([]bson.D, b.N) + for i := range docsToInsert { + docsToInsert[i] = doc + } + + _, err := coll.InsertMany(context.Background(), docsToInsert) + require.NoError(b, err, "failed to insert docs") + + b.ResetTimer() + + cursor, err := coll.Find(context.Background(), bson.D{}) + require.NoError(b, err, "failed to find data") + + defer cursor.Close(context.Background()) + + metrics := new(metrics) + + counter := 0 + for cursor.Next(context.Background()) { + recordMetrics(b, metrics, func(b *testing.B) { + err = cursor.Err() + require.NoError(b, err, "failed to advance cursor") + + if len(cursor.Current) == 0 { + b.Fatalf("error retrieving document") + } + + counter++ + }) + } + + if counter != b.N { + b.Fatalf("problem iterating cursors") + } + + err = cursor.Close(context.Background()) + require.NoError(b, err, "failed to close cursor") + + reportMetrics(b, metrics) +} + +func benchmarkMultiInsert(b *testing.B, source string) { + b.Helper() + + coll, teardown := setupBench(b) + defer teardown(b) + + doc := loadSourceDocument(b, true, testdataPerfDir(b), singleAndMultiDataDir, source) + + docsToInsert := make([]bson.D, b.N) + for i := range docsToInsert { + docsToInsert[i] = doc + } + + b.ResetTimer() + + res, err := coll.InsertMany(context.Background(), docsToInsert) + require.NoError(b, err, "failed to insert many") + + require.Len(b, res.InsertedIDs, b.N) +} + +// Test driver performance inserting multiple, small documents to the database. +func BenchmarkMultiInsertSmallDocument(b *testing.B) { + benchmarkMultiInsert(b, smallData) +} + +// Test driver performance inserting multiple, large documents to the database. +func BenchmarkMultiInsertLargeDocument(b *testing.B) { + benchmarkMultiInsert(b, largeData) +} + +func runBenchmark(name string, fn func(*testing.B)) (poplar.Test, error) { + test := poplar.Test{ + ID: fmt.Sprintf("%d", time.Now().UnixMilli()), + CreatedAt: time.Now(), + } + + result := testing.Benchmark(fn) + + if result.N == 0 { + return test, fmt.Errorf("benchmark failed to run") + } + + test.CompletedAt = test.CreatedAt.Add(result.T) + + test.Metrics = []poplar.TestMetrics{ + {Name: "total_time_seconds", Type: "SUM", Value: result.T.Seconds()}, + {Name: "iterations", Type: "SUM", Value: result.N}, + {Name: "allocated_bytes_per_op", Type: "MEAN", Value: result.AllocedBytesPerOp()}, + {Name: "allocs_per_op", Type: "MEAN", Value: result.AllocsPerOp()}, + {Name: "total_mem_allocs", Type: "SUM", Value: result.MemAllocs}, + {Name: "total_bytes_allocated", Type: "SUM", Value: result.MemBytes}, + {Name: "ns_per_op", Type: "MEAN", Value: result.NsPerOp()}, + } + + // Only tests that set bytes in the benchmark will have this metric. + if result.Bytes != 0 { + megaBytesPerOp := (float64(result.Bytes) / 1024 / 1024) / float64(result.NsPerOp()) * 1e9 + + test.Metrics = append(test.Metrics, + poplar.TestMetrics{Name: "megabytes_per_second", Type: "THROUGHPUT", Value: megaBytesPerOp}) + } + + if opsPerSecondMin := result.Extra[opsPerSecondMinName]; opsPerSecondMin != 0 { + test.Metrics = append(test.Metrics, + poplar.TestMetrics{Name: opsPerSecondMinName, Type: "THROUGHPUT", Value: opsPerSecondMin}) + } + + if opsPerSecondMax := result.Extra[opsPerSecondMaxName]; opsPerSecondMax != 0 { + test.Metrics = append(test.Metrics, + poplar.TestMetrics{Name: opsPerSecondMaxName, Type: "THROUGHPUT", Value: opsPerSecondMax}) + } + + if opsPerSecondMed := result.Extra[opsPerSecondMedName]; opsPerSecondMed != 0 { + test.Metrics = append(test.Metrics, + poplar.TestMetrics{Name: opsPerSecondMedName, Type: "THROUGHPUT", Value: opsPerSecondMed}) + } + + test.Info = poplar.TestInfo{ + TestName: name, + } + + return test, nil +} + +func TestRunAllBenchmarks(t *testing.T) { + flag.Parse() + + // Download and extract the data if it doesn't exist. + if _, err := os.Stat(testdataPerfDir(t)); os.IsNotExist(err) { + downloadTestDataTgz(t) + extractTestDataTgz(t) + } + + // The test will be run any time a benchmark is run. To avoid running all + // benchmarks in this case, we require a flag that defaults to false. The + // intention is that this test will only ever need to fully run in CI. + if !fullRun { + return + } + + // Run the cases and accumulate the results. + cases := []struct { + name string + benchmark func(*testing.B) + }{ + {name: "BenchmarkBSONFlatDocumentEncoding", benchmark: BenchmarkBSONFlatDocumentEncoding}, + {name: "BenchmarkBSONFlatDocumentDecoding", benchmark: BenchmarkBSONFlatDocumentDecoding}, + {name: "BenchmarkBSONDeepDocumentEncoding", benchmark: BenchmarkBSONDeepDocumentEncoding}, + {name: "BenchmarkBSONDeepDocumentDecoding", benchmark: BenchmarkBSONDeepDocumentDecoding}, + {name: "BenchmarkBSONFullDocumentEncoding", benchmark: BenchmarkBSONFullDocumentEncoding}, + {name: "BenchmarkBSONFullDocumentDecoding", benchmark: BenchmarkBSONFullDocumentDecoding}, + {name: "BenchmarkSingleRunCommand", benchmark: BenchmarkSingleRunCommand}, + {name: "BenchmarkSingleFindOneByID", benchmark: BenchmarkSingleFindOneByID}, + {name: "BenchmarkSmallDocInsertOne", benchmark: BenchmarkSmallDocInsertOne}, + {name: "BenchmarkLargeDocInsertOne", benchmark: BenchmarkLargeDocInsertOne}, + {name: "BenchmarkMultiFindMany", benchmark: BenchmarkMultiFindMany}, + {name: "BenchmarkMultiInsertSmallDocument", benchmark: BenchmarkMultiInsertSmallDocument}, + {name: "BenchmarkMultiInsertLargeDocument", benchmark: BenchmarkMultiInsertLargeDocument}, + } + + results := make([]poplar.Test, len(cases)) + for i := range cases { + t.Run(cases[i].name, func(t *testing.T) { + var err error + + results[i], err = runBenchmark(cases[i].name, cases[i].benchmark) + if err != nil { // Avoid asserting to prevent failures on single-run benchmarks + t.Logf("failed to run benchmark: %v", err) + } + }) + } + + // Write the results to the performance file. + evgOutput, err := json.MarshalIndent(results, "", " ") + require.NoError(t, err, "failed to encode results") + + evgOutput = append(evgOutput, []byte("\n")...) + + // Ignore gosec warning "Expect WriteFile permissions to be 0600 or less" for + // benchmark result file. + /* #nosec G306 */ + err = os.WriteFile(filepath.Join(filepath.Dir(testdataDir(t)), defaultOutputFileName), evgOutput, 0644) + require.NoError(t, err, "failed to write results") +} diff --git a/internal/cmd/benchmark/bson.go b/internal/cmd/benchmark/bson.go deleted file mode 100644 index 66911e2cdb..0000000000 --- a/internal/cmd/benchmark/bson.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import ( - "errors" - "io/ioutil" - "path/filepath" - - "go.mongodb.org/mongo-driver/v2/bson" -) - -const ( - perfDataDir = "perf" - bsonDataDir = "extended_bson" - flatBSONData = "flat_bson.json" - deepBSONData = "deep_bson.json" - fullBSONData = "full_bson.json" -) - -// utility functions for the bson benchmarks - -func loadSourceDocument(pathParts ...string) (bson.D, error) { - data, err := ioutil.ReadFile(filepath.Join(pathParts...)) - if err != nil { - return nil, err - } - var doc bson.D - err = bson.UnmarshalExtJSON(data, true, &doc) - if err != nil { - return nil, err - } - - if len(doc) == 0 { - return nil, errors.New("empty bson document") - } - - return doc, nil -} - -func loadSourceRaw(pathParts ...string) (bson.Raw, error) { - doc, err := loadSourceDocument(pathParts...) - if err != nil { - return nil, err - } - raw, err := bson.Marshal(doc) - if err != nil { - return nil, err - } - - return bson.Raw(raw), nil -} diff --git a/internal/cmd/benchmark/bson_document.go b/internal/cmd/benchmark/bson_document.go deleted file mode 100644 index 0a510ae5c8..0000000000 --- a/internal/cmd/benchmark/bson_document.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import ( - "context" - "errors" - - "go.mongodb.org/mongo-driver/v2/bson" -) - -func bsonDocumentEncoding(tm TimerManager, iters int, source string) error { - doc, err := loadSourceDocument(getProjectRoot(), perfDataDir, bsonDataDir, source) - if err != nil { - return err - } - - tm.ResetTimer() - - for i := 0; i < iters; i++ { - out, err := bson.Marshal(doc) - if err != nil { - return err - } - if len(out) == 0 { - return errors.New("marshaling error") - } - } - - return nil -} - -func bsonDocumentDecodingLazy(tm TimerManager, iters int, source string) error { - doc, err := loadSourceDocument(getProjectRoot(), perfDataDir, bsonDataDir, source) - if err != nil { - return err - } - - raw, err := bson.Marshal(doc) - if err != nil { - return err - } - - tm.ResetTimer() - - for i := 0; i < iters; i++ { - var out bson.D - err := bson.Unmarshal(raw, &out) - if err != nil { - return err - } - if len(out) == 0 { - return errors.New("marshaling error") - } - } - return nil -} - -func bsonDocumentDecoding(tm TimerManager, iters, numKeys int, source string) error { - doc, err := loadSourceDocument(getProjectRoot(), perfDataDir, bsonDataDir, source) - if err != nil { - return err - } - - raw, err := bson.Marshal(doc) - if err != nil { - return err - } - - tm.ResetTimer() - - for i := 0; i < iters; i++ { - var out bson.D - err := bson.Unmarshal(raw, &out) - if err != nil { - return err - } - - if len(out) != numKeys { - return errors.New("document parsing error") - } - } - return nil - -} - -func BSONFlatDocumentEncoding(_ context.Context, tm TimerManager, iters int) error { - return bsonDocumentEncoding(tm, iters, flatBSONData) -} - -func BSONFlatDocumentDecodingLazy(_ context.Context, tm TimerManager, iters int) error { - return bsonDocumentDecodingLazy(tm, iters, flatBSONData) -} - -func BSONFlatDocumentDecoding(_ context.Context, tm TimerManager, iters int) error { - return bsonDocumentDecoding(tm, iters, 145, flatBSONData) -} - -func BSONDeepDocumentEncoding(_ context.Context, tm TimerManager, iters int) error { - return bsonDocumentEncoding(tm, iters, deepBSONData) -} - -func BSONDeepDocumentDecodingLazy(_ context.Context, tm TimerManager, iters int) error { - return bsonDocumentDecodingLazy(tm, iters, deepBSONData) -} - -func BSONDeepDocumentDecoding(_ context.Context, tm TimerManager, iters int) error { - return bsonDocumentDecoding(tm, iters, 126, deepBSONData) -} - -func BSONFullDocumentEncoding(_ context.Context, tm TimerManager, iters int) error { - return bsonDocumentEncoding(tm, iters, fullBSONData) -} - -func BSONFullDocumentDecodingLazy(_ context.Context, tm TimerManager, iters int) error { - return bsonDocumentDecodingLazy(tm, iters, fullBSONData) -} - -func BSONFullDocumentDecoding(_ context.Context, tm TimerManager, iters int) error { - return bsonDocumentDecoding(tm, iters, 145, fullBSONData) -} diff --git a/internal/cmd/benchmark/bson_map.go b/internal/cmd/benchmark/bson_map.go deleted file mode 100644 index 0cc09dcbfd..0000000000 --- a/internal/cmd/benchmark/bson_map.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import ( - "bytes" - "context" - "errors" - "fmt" - - "go.mongodb.org/mongo-driver/v2/bson" -) - -func bsonMapDecoding(tm TimerManager, iters int, dataSet string) error { - r, err := loadSourceRaw(getProjectRoot(), perfDataDir, bsonDataDir, dataSet) - if err != nil { - return err - } - - tm.ResetTimer() - - for i := 0; i < iters; i++ { - out := make(map[string]interface{}) - err := bson.Unmarshal(r, &out) - if err != nil { - return nil - } - if len(out) == 0 { - return fmt.Errorf("decoding failed") - } - } - return nil -} - -func bsonMapEncoding(tm TimerManager, iters int, dataSet string) error { - r, err := loadSourceRaw(getProjectRoot(), perfDataDir, bsonDataDir, dataSet) - if err != nil { - return err - } - - doc := make(map[string]interface{}) - err = bson.Unmarshal(r, &doc) - if err != nil { - return err - } - - tm.ResetTimer() - buf := new(bytes.Buffer) - for i := 0; i < iters; i++ { - buf.Reset() - vw := bson.NewDocumentWriter(buf) - err = bson.NewEncoder(vw).Encode(doc) - if err != nil { - return err - } - - if buf.Len() == 0 { - return errors.New("encoding failed") - } - } - - return nil -} - -func BSONFlatMapDecoding(_ context.Context, tm TimerManager, iters int) error { - return bsonMapDecoding(tm, iters, flatBSONData) -} - -func BSONFlatMapEncoding(_ context.Context, tm TimerManager, iters int) error { - return bsonMapEncoding(tm, iters, flatBSONData) -} - -func BSONDeepMapDecoding(_ context.Context, tm TimerManager, iters int) error { - return bsonMapDecoding(tm, iters, deepBSONData) -} - -func BSONDeepMapEncoding(_ context.Context, tm TimerManager, iters int) error { - return bsonMapEncoding(tm, iters, deepBSONData) -} - -func BSONFullMapDecoding(_ context.Context, tm TimerManager, iters int) error { - return bsonMapDecoding(tm, iters, fullBSONData) -} - -func BSONFullMapEncoding(_ context.Context, tm TimerManager, iters int) error { - return bsonMapEncoding(tm, iters, fullBSONData) -} diff --git a/internal/cmd/benchmark/bson_struct.go b/internal/cmd/benchmark/bson_struct.go deleted file mode 100644 index 6e41b20dab..0000000000 --- a/internal/cmd/benchmark/bson_struct.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import ( - "bytes" - "context" - "errors" - - "go.mongodb.org/mongo-driver/v2/bson" -) - -func BSONFlatStructDecoding(_ context.Context, tm TimerManager, iters int) error { - r, err := loadSourceRaw(getProjectRoot(), perfDataDir, bsonDataDir, flatBSONData) - if err != nil { - return err - } - - tm.ResetTimer() - - for i := 0; i < iters; i++ { - out := flatBSON{} - err := bson.Unmarshal(r, &out) - if err != nil { - return err - } - } - return nil -} - -func BSONFlatStructEncoding(_ context.Context, tm TimerManager, iters int) error { - r, err := loadSourceRaw(getProjectRoot(), perfDataDir, bsonDataDir, flatBSONData) - if err != nil { - return err - } - - doc := flatBSON{} - err = bson.Unmarshal(r, &doc) - if err != nil { - return err - } - - var buf []byte - - tm.ResetTimer() - for i := 0; i < iters; i++ { - buf, err = bson.Marshal(doc) - if err != nil { - return err - } - if len(buf) == 0 { - return errors.New("encoding failed") - } - } - return nil -} - -func BSONFlatStructTagsEncoding(_ context.Context, tm TimerManager, iters int) error { - r, err := loadSourceRaw(getProjectRoot(), perfDataDir, bsonDataDir, flatBSONData) - if err != nil { - return err - } - - doc := flatBSONTags{} - err = bson.Unmarshal(r, &doc) - if err != nil { - return err - } - - buf := new(bytes.Buffer) - - tm.ResetTimer() - for i := 0; i < iters; i++ { - buf.Reset() - vw := bson.NewDocumentWriter(buf) - err = bson.NewEncoder(vw).Encode(doc) - if err != nil { - return err - } - if buf.Len() == 0 { - return errors.New("encoding failed") - } - } - return nil -} - -func BSONFlatStructTagsDecoding(_ context.Context, tm TimerManager, iters int) error { - r, err := loadSourceRaw(getProjectRoot(), perfDataDir, bsonDataDir, flatBSONData) - if err != nil { - return err - } - - tm.ResetTimer() - for i := 0; i < iters; i++ { - out := flatBSONTags{} - err := bson.Unmarshal(r, &out) - if err != nil { - return err - } - } - return nil -} diff --git a/internal/cmd/benchmark/bson_test.go b/internal/cmd/benchmark/bson_test.go deleted file mode 100644 index b3a3cd8b7d..0000000000 --- a/internal/cmd/benchmark/bson_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import "testing" - -// func BenchmarkBSONFullReaderDecoding(b *testing.B) { WrapCase(BSONFullReaderDecoding)(b) } - -func BenchmarkBSONFlatDocumentEncoding(b *testing.B) { WrapCase(BSONFlatDocumentEncoding)(b) } -func BenchmarkBSONFlatDocumentDecodingLazy(b *testing.B) { WrapCase(BSONFlatDocumentDecodingLazy)(b) } -func BenchmarkBSONFlatDocumentDecoding(b *testing.B) { WrapCase(BSONFlatDocumentDecoding)(b) } -func BenchmarkBSONDeepDocumentEncoding(b *testing.B) { WrapCase(BSONDeepDocumentEncoding)(b) } -func BenchmarkBSONDeepDocumentDecodingLazy(b *testing.B) { WrapCase(BSONDeepDocumentDecodingLazy)(b) } -func BenchmarkBSONDeepDocumentDecoding(b *testing.B) { WrapCase(BSONDeepDocumentDecoding)(b) } - -// func BenchmarkBSONFullDocumentEncoding(b *testing.B) { WrapCase(BSONFullDocumentEncoding)(b) } -// func BenchmarkBSONFullDocumentDecodingLazy(b *testing.B) { WrapCase(BSONFullDocumentDecodingLazy)(b) } -// func BenchmarkBSONFullDocumentDecoding(b *testing.B) { WrapCase(BSONFullDocumentDecoding)(b) } - -func BenchmarkBSONFlatMapDecoding(b *testing.B) { WrapCase(BSONFlatMapDecoding)(b) } -func BenchmarkBSONFlatMapEncoding(b *testing.B) { WrapCase(BSONFlatMapEncoding)(b) } -func BenchmarkBSONDeepMapDecoding(b *testing.B) { WrapCase(BSONDeepMapDecoding)(b) } -func BenchmarkBSONDeepMapEncoding(b *testing.B) { WrapCase(BSONDeepMapEncoding)(b) } - -// func BenchmarkBSONFullMapDecoding(b *testing.B) { WrapCase(BSONFullMapDecoding)(b) } -// func BenchmarkBSONFullMapEncoding(b *testing.B) { WrapCase(BSONFullMapEncoding)(b) } - -func BenchmarkBSONFlatStructDecoding(b *testing.B) { WrapCase(BSONFlatStructDecoding)(b) } -func BenchmarkBSONFlatStructTagsDecoding(b *testing.B) { WrapCase(BSONFlatStructTagsDecoding)(b) } -func BenchmarkBSONFlatStructEncoding(b *testing.B) { WrapCase(BSONFlatStructEncoding)(b) } -func BenchmarkBSONFlatStructTagsEncoding(b *testing.B) { WrapCase(BSONFlatStructTagsEncoding)(b) } diff --git a/internal/cmd/benchmark/bson_types.go b/internal/cmd/benchmark/bson_types.go deleted file mode 100644 index 705649042e..0000000000 --- a/internal/cmd/benchmark/bson_types.go +++ /dev/null @@ -1,308 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import ( - "go.mongodb.org/mongo-driver/v2/bson" -) - -type flatBSONTags struct { - ID bson.ObjectID `bson:"_id"` - - AA int64 `bson:"AAgSNVyBb"` - AI bool `bson:"aicoMxZq"` - AM int64 `bson:"AMQrGQmu"` - Ag int `bson:"AgYYbYPr"` - Ah int64 `bson:"ahFCBmqT"` - At int64 `bson:"AtWNZJXa"` - BB string `bson:"BBqZInWV"` - BK int64 `bson:"bkuaZWRT"` - Bw int `bson:"BwTXiovJ"` - CD int `bson:"CDIGOuIZ"` - CEA string `bson:"CEtYKsdd"` - CEB string `bson:"cepcgozk"` - CF int `bson:"CFujXoob"` - CV int64 `bson:"cVjWCrlu"` - CX string `bson:"cxOHMeDJ"` - CY string `bson:"CYhSCkWB"` - Cq string `bson:"CqCssWxW"` - DC int `bson:"dCLfYqqM"` - DDA int `bson:"ddPdLgGg"` - DDB int `bson:"ddVenEkK"` - DH string `bson:"dHsYhRbV"` - DJ int `bson:"DJsnHZIC"` - DN string `bson:"dNSuxlSU"` - DO int64 `bson:"doshbrpF"` - DP string `bson:"dpbwfSRb"` - DQ int64 `bson:"DQBQcQFj"` - DT string `bson:"dtywOLeD"` - DV int `bson:"dVkWIafN"` - EG bool `bson:"egxZaSsw"` - ER string `bson:"eRTIdIJR"` - FD int64 `bson:"FDYGeSiR"` - FE string `bson:"fEheUtop"` - Fp bool `bson:"FpduyhQP"` - GE string `bson:"gErhgZTh"` - GY int `bson:"gySFZeAE"` - Gi uint `bson:"GiAHzFII"` - HN string `bson:"hnVgYIQi"` - HQA int `bson:"HQeCoswW"` - HQB int `bson:"HQiykral"` - HV int64 `bson:"HVHyetUM"` - HW int `bson:"hwHOTmmW"` - Hi bool `bson:"HicJbMpj"` - Hr int `bson:"HrUPbFHD"` - IF string `bson:"iFFGfTXc"` - IJ int `bson:"ijwXMKqI"` - IW int `bson:"iwfbMdcv"` - Ib string `bson:"Ibrdrtgg"` - Is bool `bson:"IsorvnMR"` - JB string `bson:"jbUymqiB"` - JM string `bson:"jmglLvAS"` - JW int `bson:"jWaFvVAz"` - JX int `bson:"JXMyYkfb"` - Jh bool `bson:"JhImQOkw"` - Jr string `bson:"JrJzKiIx"` - Jz int `bson:"JzgaUWVG"` - KF bool `bson:"kfvcFmKw"` - KM int64 `bson:"KMKBtlov"` - Kn string `bson:"KnhgtAOJ"` - Ky int `bson:"KyxOoCqS"` - LU string `bson:"LUPqMOHS"` - LV bool `bson:"LVNIFCYm"` - Ln int `bson:"LngvlnTV"` - ML int `bson:"mlfZVfVT"` - MN bool `bson:"MNuWZMLP"` - MX int `bson:"MXMxLVBk"` - Mc string `bson:"McpOBmaR"` - Me string `bson:"MeUYSkPS"` - Mq int `bson:"MqfkBZJF"` - NB int `bson:"nBKWWUWk"` - NK int `bson:"nKhiSITP"` - OB int `bson:"obcwwqWZ"` - OC string `bson:"OCsIhHxq"` - OM int `bson:"omnwvBbA"` - OR string `bson:"oRWMNJTE"` - Of string `bson:"OfTmCvDx"` - PA int `bson:"pacTBmxE"` - PF int `bson:"PFZSRHNN"` - PK bool `bson:"pKjOghFa"` - PO int `bson:"pOMEwSod"` - PP string `bson:"pPtPsgRl"` - PQ int `bson:"pQyCJaEd"` - Pj int `bson:"PjKiuWnQ"` - Pv int `bson:"PvfnpsMV"` - QH int `bson:"qHzOMXeT"` - QR bool `bson:"qrJASGzU"` - Qo string `bson:"QobifTeZ"` - RE int64 `bson:"reiKnuza"` - RM string `bson:"rmzUAgmk"` - RP string `bson:"RPsQhgRD"` - Rb uint `bson:"Rbxpznea"` - ReA bool `bson:"RemSsnnR"` - ReB int `bson:"ReOZakjB"` - Rw string `bson:"RwAVVKHM"` - SG bool `bson:"sGWJTAcT"` - SU uint8 `bson:"SUWXijHT"` - SYA int64 `bson:"sYtnozSc"` - SYB string `bson:"SYtZkQbC"` - Sq int64 `bson:"SqNvlUZF"` - TA int `bson:"taoNnQYY"` - TD string `bson:"TDUzNJiH"` - TI string `bson:"tIJEYSYM"` - TR bool `bson:"TRpgnInA"` - Tg int `bson:"TgSwBbgp"` - Tk int64 `bson:"TkXMwZlU"` - Tm int64 `bson:"TmUnYUrv"` - UK int `bson:"UKwbAKGw"` - UM string `bson:"uMDWqLMf"` - Up bool `bson:"UpdMADoN"` - Ut int64 `bson:"UtbwOKLt"` - VC int64 `bson:"VCSKFCoE"` - VK string `bson:"vkEDWgmN"` - VL string `bson:"vlSZaxCV"` - VS string `bson:"vSLTtfDF"` - VVA bool `bson:"vvUeXASH"` - VVB int `bson:"VVvwKVRG"` - Vc bool `bson:"VcCSqSmp"` - Vp int16 `bson:"VplFgewF"` - Vt string `bson:"VtzeOlCT"` - WH bool `bson:"WHSQVLKG"` - WJA bool `bson:"wjfyueDC"` - WJB string `bson:"wjAWaOog"` - WM int64 `bson:"wmDLUkXt"` - WY string `bson:"WYJdGJLu"` - Wm bool `bson:"WmMOvgFc"` - Wo string `bson:"WoFGfdvb"` - XE int `bson:"XEBqaXkB"` - XG bool `bson:"XGxlHrXf"` - XR string `bson:"xrzGnsEK"` - XWA int64 `bson:"xWpeGNjl"` - XWB string `bson:"xWUlYggc"` - XX int64 `bson:"XXKbyIXG"` - XZ int64 `bson:"xZOksssj"` - Xe uint `bson:"XeRkAyCq"` - Xx int `bson:"XxvXmHiQ"` - YD string `bson:"YDHWnEXV"` - YE bool `bson:"yeTUgNrU"` - YK int `bson:"yKfZnGKG"` - YX string `bson:"yXSBbPeT"` - ZD bool `bson:"zDzSGNnW"` - ZE bool `bson:"zEgGhhZf"` - ZM string `bson:"zMCFzcWY"` - ZSA int64 `bson:"zSYvADVf"` - ZSB int64 `bson:"zswQbWEI"` - Zm string `bson:"ZmtEJFSO"` -} - -type flatBSON struct { - AMQrGQmu int64 - AAgSNVyBb int64 - AgYYbYPr int - AtWNZJXa int64 - BBqZInWV string - BwTXiovJ int - CDIGOuIZ int - CEtYKsdd string - CFujXoob int - CYhSCkWB string - CqCssWxW string - DJsnHZIC int - DQBQcQFj int64 - FDYGeSiR int64 - FpduyhQP bool - GiAHzFII uint - HQeCoswW int - HQiykral int - HVHyetUM int64 - HicJbMpj bool - HrUPbFHD int - Ibrdrtgg string - IsorvnMR bool - JXMyYkfb int - JhImQOkw bool - JrJzKiIx string - JzgaUWVG int - KMKBtlov int64 - KnhgtAOJ string - KyxOoCqS int - LUPqMOHS string - LVNIFCYm bool - LngvlnTV int - MNuWZMLP bool - MXMxLVBk int - McpOBmaR string - MeUYSkPS string - MqfkBZJF int - OCsIhHxq string - OfTmCvDx string - PjKiuWnQ int - PvfnpsMV int - QobifTeZ string - RPsQhgRD string - Rbxpznea uint - ReOZakjB int - RemSsnnR bool - RwAVVKHM string - SUWXijHT uint8 - SYtZkQbC string - SqNvlUZF int64 - TDUzNJiH string - TRpgnInA bool - TgSwBbgp int - TkXMwZlU int64 - TmUnYUrv int64 - UKwbAKGw int - UpdMADoN bool - UtbwOKLt int64 - VCSKFCoE int64 - VVvwKVRG int - VcCSqSmp bool - VplFgewF int16 - VtzeOlCT string - WHSQVLKG bool - WYJdGJLu string - WmMOvgFc bool - WoFGfdvb string - XEBqaXkB int - XGxlHrXf bool - XXKbyIXG int64 - XeRkAyCq uint - XxvXmHiQ int - YDHWnEXV string - ZmtEJFSO string - ID bson.ObjectID `bson:"_id"` - AhFCBmqT int64 - AicoMxZq bool - BkuaZWRT int64 - CVjWCrlu int64 - Cepcgozk string - CxOHMeDJ string - DCLfYqqM int - DHsYhRbV string - DNSuxlSU string - DVkWIafN int - DdPdLgGg int - DdVenEkK int - DoshbrpF int64 - DpbwfSRb string - DtywOLeD string - ERTIdIJR string - EgxZaSsw bool - FEheUtop string - GErhgZTh string - GySFZeAE int - HnVgYIQi string - HwHOTmmW int - IFFGfTXc string - IjwXMKqI int - IwfbMdcv int - JWaFvVAz int - JbUymqiB string - JmglLvAS string - KfvcFmKw bool - MlfZVfVT int - NBKWWUWk int - NKhiSITP int - ORWMNJTE string - ObcwwqWZ int - OmnwvBbA int - PKjOghFa bool - POMEwSod int - PPtPsgRl string - PQyCJaEd int - PacTBmxE int - QHzOMXeT int - QrJASGzU bool - ReiKnuza int64 - RmzUAgmk string - SGWJTAcT bool - SYtnozSc int64 - TIJEYSYM string - TaoNnQYY int - UMDWqLMf string - VSLTtfDF string - VkEDWgmN string - VlSZaxCV string - VvUeXASH bool - WjAWaOog string - WjfyueDC bool - WmDLUkXt int64 - XWUlYggc string - XWpeGNjl int64 - XZOksssj int64 - XrzGnsEK string - YKfZnGKG int - YXSBbPeT string - YeTUgNrU bool - ZDzSGNnW bool - ZEgGhhZf bool - ZMCFzcWY string - ZSYvADVf int64 - ZswQbWEI int64 - PfZSRHnn int -} diff --git a/internal/cmd/benchmark/go.mod b/internal/cmd/benchmark/go.mod index 48c0a40277..5d9afd88f6 100644 --- a/internal/cmd/benchmark/go.mod +++ b/internal/cmd/benchmark/go.mod @@ -4,26 +4,90 @@ go 1.18 replace go.mongodb.org/mongo-driver/v2 => ../../../ -// Note that the Go driver version is replaced with the local Go driver code by -// the replace directive above. - require ( - github.com/montanaflynn/stats v0.7.1 - github.com/stretchr/testify v1.9.0 - go.mongodb.org/mongo-driver/v2 v2.0.0-alpha2 + github.com/evergreen-ci/poplar v0.0.0-20240904151346-8d03d2bacde0 + github.com/stretchr/testify v1.8.1 + go.mongodb.org/mongo-driver/v2 v2.0.0-00010101000000-000000000000 ) require ( + github.com/PuerkitoBio/rehttp v1.1.0 // indirect + github.com/andygrunwald/go-jira v1.14.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.30.3 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 // indirect + github.com/aws/aws-sdk-go-v2/config v1.27.27 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.27 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.58.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 // indirect + github.com/aws/smithy-go v1.20.3 // indirect + github.com/bluele/slack v0.0.0-20180528010058-b4b4d354a079 // indirect + github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dghubble/oauth1 v0.7.1 // indirect + github.com/evergreen-ci/aviation v0.0.0-20240509141021-0e3a1c91cc79 // indirect + github.com/evergreen-ci/birch v0.0.0-20220401151432-c792c3d8e0eb // indirect + github.com/evergreen-ci/gimlet v0.0.0-20220401151443-33c830c51cee // indirect + github.com/evergreen-ci/negroni v1.0.1-0.20211028183800-67b6d7c2c035 // indirect + github.com/evergreen-ci/pail v0.0.0-20240808162451-ba76772cf567 // indirect + github.com/evergreen-ci/utility v0.0.0-20220404192535-d16eb64796e6 // indirect + github.com/fatih/structs v1.1.0 // indirect + github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/fuyufjh/splunk-hec-go v0.3.4-0.20190414090710-10df423a9f36 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/golang-jwt/jwt v3.2.2+incompatible // indirect + github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/go-github v17.0.0+incompatible // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/gorilla/mux v1.8.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect github.com/klauspost/compress v1.13.6 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/mattn/go-xmpp v0.0.0-20210723025538-3871461df959 // indirect + github.com/mongodb/ftdc v0.0.0-20220401165013-13e4af55e809 // indirect + github.com/mongodb/grip v0.0.0-20220401165023-6a1d9bb90c21 // indirect + github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808 // indirect + github.com/papertrail/go-tail v0.0.0-20180509224916-973c153b0431 // indirect + github.com/phyber/negroni-gzip v1.0.0 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/rs/cors v1.8.2 // indirect + github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 // indirect + github.com/shirou/gopsutil/v3 v3.22.3 // indirect + github.com/tklauser/go-sysconf v0.3.10 // indirect + github.com/tklauser/numcpus v0.4.0 // indirect + github.com/trivago/tgo v1.0.7 // indirect + github.com/urfave/negroni v1.0.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect + github.com/yusufpapurcu/wmi v1.2.2 // indirect + go.mongodb.org/mongo-driver v1.12.1 // indirect golang.org/x/crypto v0.27.0 // indirect + golang.org/x/net v0.21.0 // indirect + golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1 // indirect golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.25.0 // indirect golang.org/x/text v0.18.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 // indirect + google.golang.org/grpc v1.51.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/cmd/benchmark/go.sum b/internal/cmd/benchmark/go.sum index f18c5c5095..6e286fc95f 100644 --- a/internal/cmd/benchmark/go.sum +++ b/internal/cmd/benchmark/go.sum @@ -1,55 +1,630 @@ +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= +github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +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/PuerkitoBio/rehttp v1.1.0 h1:JFZ7OeK+hbJpTxhNB0NDZT47AuXqCU0Smxfjtph7/Rs= +github.com/PuerkitoBio/rehttp v1.1.0/go.mod h1:LUwKPoDbDIA2RL5wYZCNsQ90cx4OJ4AWBmq6KzWZL1s= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/andygrunwald/go-jira v0.0.0-20170512141550-c8c6680f245f/go.mod h1:yNYQrX3nGSrVdcVsM2mWz2pm7tTeDtYfRyVEkc3VUiY= +github.com/andygrunwald/go-jira v1.14.0 h1:7GT/3qhar2dGJ0kq8w0d63liNyHOnxZsUZ9Pe4+AKBI= +github.com/andygrunwald/go-jira v1.14.0/go.mod h1:KMo2f4DgMZA1C9FdImuLc04x4WQhn5derQpnsuBFgqE= +github.com/aws/aws-sdk-go-v2 v1.30.3 h1:jUeBtG0Ih+ZIFH0F4UkmL9w3cSpaMv9tYYDbzILP8dY= +github.com/aws/aws-sdk-go-v2 v1.30.3/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 h1:tW1/Rkad38LA15X4UQtjXZXNKsCgkshC3EbmcUmghTg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3/go.mod h1:UbnqO+zjqk3uIt9yCACHJ9IVNhyhOCnYk8yA19SAWrM= +github.com/aws/aws-sdk-go-v2/config v1.27.27 h1:HdqgGt1OAP0HkEDDShEl0oSYa9ZZBSOmKpdpsDMdO90= +github.com/aws/aws-sdk-go-v2/config v1.27.27/go.mod h1:MVYamCg76dFNINkZFu4n4RjDixhVr51HLj4ErWzrVwg= +github.com/aws/aws-sdk-go-v2/credentials v1.17.27 h1:2raNba6gr2IfA0eqqiP2XiQ0UVOpGPgDSi0I9iAP+UI= +github.com/aws/aws-sdk-go-v2/credentials v1.17.27/go.mod h1:gniiwbGahQByxan6YjQUMcW4Aov6bLC3m+evgcoN4r4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 h1:KreluoV8FZDEtI6Co2xuNk/UqI9iwMrOx/87PBNIKqw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11/go.mod h1:SeSUYBLsMYFoRvHE0Tjvn7kbxaUhl75CJi1sbfhMxkU= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10 h1:zeN9UtUlA6FTx0vFSayxSX32HDw73Yb6Hh2izDSFxXY= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10/go.mod h1:3HKuexPDcwLWPaqpW2UR/9n8N/u/3CKcGAzSs8p8u8g= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 h1:SoNJ4RlFEQEbtDcCEt+QG56MY4fm4W8rYirAmq+/DdU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15/go.mod h1:U9ke74k1n2bf+RIgoX1SXFed1HLs51OgUSs+Ph0KJP8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 h1:C6WHdGnTDIYETAm5iErQUiVNsclNx9qbJVPIt03B6bI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15/go.mod h1:ZQLZqhcu+JhSrA9/NXRm8SkDvsycE+JkV3WGY41e+IM= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15 h1:Z5r7SycxmSllHYmaAZPpmN8GviDrSGhMS6bldqtXZPw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15/go.mod h1:CetW7bDE00QoGEmPUoZuRog07SGVAUVW6LFpNP0YfIg= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 h1:dT3MqvGhSoaIhRseqw2I0yH81l7wiR2vjs57O51EAm8= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3/go.mod h1:GlAeCkHwugxdHaueRr4nhPuY+WW+gR8UjlcqzPr1SPI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17 h1:YPYe6ZmvUfDDDELqEKtAd6bo8zxhkm+XEFEzQisqUIE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17/go.mod h1:oBtcnYua/CgzCWYN7NZ5j7PotFDaFSUjCYVTtfyn7vw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 h1:HGErhhrxZlQ044RiM+WdoZxp0p+EGM62y3L6pwA4olE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17/go.mod h1:RkZEx4l0EHYDJpWppMJ3nD9wZJAa8/0lq9aVC+r2UII= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15 h1:246A4lSTXWJw/rmlQI+TT2OcqeDMKBdyjEQrafMaQdA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15/go.mod h1:haVfg3761/WF7YPuJOER2MP0k4UAXyHaLclKXB6usDg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.58.3 h1:hT8ZAZRIfqBqHbzKTII+CIiY8G2oC9OpLedkZ51DWl8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.58.3/go.mod h1:Lcxzg5rojyVPU/0eFwLtcyTaek/6Mtic5B1gJo7e/zE= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 h1:BXx0ZIxvrJdSgSvKTZ+yRBeSqqgPM89VPlulEcl37tM= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.4/go.mod h1:ooyCOXjvJEsUw7x+ZDHeISPMhtwI3ZCB7ggFMcFfWLU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 h1:yiwVzJW2ZxZTurVbYWA7QOrAaCYQR72t0wrSBfoesUE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4/go.mod h1:0oxfLkpz3rQ/CHlx5hB7H69YUpFiI1tql6Q6Ne+1bCw= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 h1:ZsDKRLXGWHk8WdtyYMoGNO7bTudrvuKpDKgMVRlepGE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.3/go.mod h1:zwySh8fpFyXp9yOr/KVzxOl8SRqgf/IDw5aUt9UKFcQ= +github.com/aws/smithy-go v1.20.3 h1:ryHwveWzPV5BIof6fyDvor6V3iUL7nTfiTKXHiW05nE= +github.com/aws/smithy-go v1.20.3/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aybabtme/iocontrol v0.0.0-20150809002002-ad15bcfc95a0 h1:0NmehRCgyk5rljDQLKUO+cRJCnduDyn11+zGZIc9Z48= +github.com/aybabtme/iocontrol v0.0.0-20150809002002-ad15bcfc95a0/go.mod h1:6L7zgvqo0idzI7IO8de6ZC051AfXb5ipkIJ7bIA2tGA= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bluele/slack v0.0.0-20180528010058-b4b4d354a079 h1:dm7wU6Dyf+rVGryOAB8/J/I+pYT/9AdG8dstD3kdMWU= +github.com/bluele/slack v0.0.0-20180528010058-b4b4d354a079/go.mod h1:W679Ri2W93VLD8cVpEY/zLH1ow4zhJcCyjzrKxfM3QM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +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/coreos/go-systemd v0.0.0-20160607160209-6dc8b843c670/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= +github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +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/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= +github.com/dghubble/oauth1 v0.7.0/go.mod h1:8pFdfPkv/jr8mkChVbNVuJ0suiHe278BtWI4Tk1ujxk= +github.com/dghubble/oauth1 v0.7.1 h1:JjbOVSVVkms9A4h/sTQy5Jb2nFuAAVb2qVYgenJPyrE= +github.com/dghubble/oauth1 v0.7.1/go.mod h1:0eEzON0UY/OLACQrmnjgJjmvCGXzjBCsZqL1kWDXtF0= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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/evergreen-ci/aviation v0.0.0-20240509141021-0e3a1c91cc79 h1:pIQpqil9BYFhZkBGZ7CsGQ7/Kz4GLvnFp6TDV4lbJ6s= +github.com/evergreen-ci/aviation v0.0.0-20240509141021-0e3a1c91cc79/go.mod h1:aUvipiBrechcLJyZx2IOp43HRAEM9iSNn4oLIWBQ4NQ= +github.com/evergreen-ci/birch v0.0.0-20191213201306-f4dae6f450a2/go.mod h1:IfmR6rcYhoHGAdYS51VEr60p1YzzXJvb7pFtGdNc88A= +github.com/evergreen-ci/birch v0.0.0-20220401151432-c792c3d8e0eb h1:8JTwpIvxuM9/LUogsfAAdnNkxkbwwyRXuPLEF8MIR4o= +github.com/evergreen-ci/birch v0.0.0-20220401151432-c792c3d8e0eb/go.mod h1:VwKNloyO+PS+AkmshHmpHih8aVoQ3eyqWOXAnlUT5Kk= +github.com/evergreen-ci/gimlet v0.0.0-20220401150826-5898de01dbd8/go.mod h1:LfnJ3oYEVFUHwIPoAotvn9bbtAT+lAaCpH5YYnyxluk= +github.com/evergreen-ci/gimlet v0.0.0-20220401151443-33c830c51cee h1:+4jp62usQsVoZb/KTYT7DetD04hbcXPjP/XhjJq0zws= +github.com/evergreen-ci/gimlet v0.0.0-20220401151443-33c830c51cee/go.mod h1:NqXYQ2lPMU7dY33a4ZrqXJKQ3ZY8IZru8H/rpY0hrxs= +github.com/evergreen-ci/negroni v1.0.1-0.20211028183800-67b6d7c2c035 h1:oVU/ni/sRq+GAogUMLa7LBGtvVHMVLbisuytxBC5KaY= +github.com/evergreen-ci/negroni v1.0.1-0.20211028183800-67b6d7c2c035/go.mod h1:pvK7NM0ZC+sfTLuIiJN4BgM1S9S5Oo79PJReAFFph18= +github.com/evergreen-ci/pail v0.0.0-20240808162451-ba76772cf567 h1:jC23wmaGPRnZlk/d1ohS+Acdkca+kzuLnIMA0Qg3+uI= +github.com/evergreen-ci/pail v0.0.0-20240808162451-ba76772cf567/go.mod h1:ylFLTPr5wqF44aqz/RBSHZ/mfbpp7LELHkbyb+DqOME= +github.com/evergreen-ci/poplar v0.0.0-20240904151346-8d03d2bacde0 h1:ONOGUGCWnO5I5KgRAhrY1JzlndKmBapTdZ6A9yOKhgA= +github.com/evergreen-ci/poplar v0.0.0-20240904151346-8d03d2bacde0/go.mod h1:6Ilzy/iipW39u9G9wwabSSU08A+l4b+q9KqaNDgEvDA= +github.com/evergreen-ci/utility v0.0.0-20220404192535-d16eb64796e6 h1:K7gQ8KBfq3wH8+BSSjZG9ZdD9P5KO2XZJxVQeg0eUW8= +github.com/evergreen-ci/utility v0.0.0-20220404192535-d16eb64796e6/go.mod h1:wSui4nRyDZzm2db7Ju7ZzBAelLyVLmcTPJEIh1IdSrc= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fuyufjh/splunk-hec-go v0.3.3/go.mod h1:DSeNMkIDw6WdmEnc4CBxC1+Hk12JEQcsaymRG/g/Qns= +github.com/fuyufjh/splunk-hec-go v0.3.4-0.20190414090710-10df423a9f36 h1:eUGetkix+fHaXePa+lCFL/z+Wpetv/afdd798N0EdcY= +github.com/fuyufjh/splunk-hec-go v0.3.4-0.20190414090710-10df423a9f36/go.mod h1:DSeNMkIDw6WdmEnc4CBxC1+Hk12JEQcsaymRG/g/Qns= +github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +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-ldap/ldap/v3 v3.4.2/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/goccy/go-json v0.9.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +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.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.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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.2/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.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +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/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +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/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= -github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= +github.com/lestrrat-go/codegen v1.0.0/go.mod h1:JhJw6OQAuPEfVKUCLItpaVLumDGWQznd1VaXrBk9TdM= +github.com/lestrrat-go/httpcc v1.0.0/go.mod h1:tGS/u00Vh5N6FHNkExqGGNId8e0Big+++0Gf8MBnAvE= +github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= +github.com/lestrrat-go/jwx v1.2.18/go.mod h1:bWTBO7IHHVMtNunM8so9MT8wD+euEY1PzGEyCnuI2qM= +github.com/lestrrat-go/option v0.0.0-20210103042652-6f1ecfceda35/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lestrrat-go/pdebug/v3 v3.0.1/go.mod h1:za+m+Ve24yCxTEhR59N7UlnJomWwCiIqbJRmKeiADU4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/mattn/go-xmpp v0.0.0-20161121012536-f4550b539938/go.mod h1:Cs5mF0OsrRRmhkyOod//ldNPOwJsrBvJ+1WRspv0xoc= +github.com/mattn/go-xmpp v0.0.0-20210723025538-3871461df959 h1:heUerLk4jOhweir4OqSGDUZueo9dRRtBcglPB44XRYY= +github.com/mattn/go-xmpp v0.0.0-20210723025538-3871461df959/go.mod h1:Cs5mF0OsrRRmhkyOod//ldNPOwJsrBvJ+1WRspv0xoc= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mongodb/ftdc v0.0.0-20220401165013-13e4af55e809 h1:CQVEigRr2M/OFIPn+wQWerSadMioMY1cLp22yZX+Ygk= +github.com/mongodb/ftdc v0.0.0-20220401165013-13e4af55e809/go.mod h1:zz0HHFUU4/TOxl9TW4P9t3y3Ivx+sTWS2nwnhuYYRdw= +github.com/mongodb/grip v0.0.0-20211018154934-e661a71929d5/go.mod h1:g0r93iHSTLD50bDT7vNj+z+Y3nKz9o/tQXtB9esq2tk= +github.com/mongodb/grip v0.0.0-20220401165023-6a1d9bb90c21 h1:SBXhTs+Umg5AX4uBrNbfq6hbxJELFCN42j3fC7QJG+M= +github.com/mongodb/grip v0.0.0-20220401165023-6a1d9bb90c21/go.mod h1:QfF6CwbaTQx1Kgww77c6ROPBFN+JCiU2qBnk2SjKHyU= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808 h1:pmpDGKLw4n82EtrNiLqB+xSz/JQwFOaZuMALYUHwX5s= +github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/okta/okta-jwt-verifier-golang v1.2.1/go.mod h1:cHffA777f7Yi4K+yDzUp89sGD5v8sk04Pc3CiT1OMR8= +github.com/okta/okta-jwt-verifier-golang v1.3.0/go.mod h1:cHffA777f7Yi4K+yDzUp89sGD5v8sk04Pc3CiT1OMR8= +github.com/papertrail/go-tail v0.0.0-20180509224916-973c153b0431 h1:i1egM7gz4bPxLCIwBJOkpk6TqHpjTnL4dE1xdN/4dcs= +github.com/papertrail/go-tail v0.0.0-20180509224916-973c153b0431/go.mod h1:dMID0RaS2a5rhpOjC4RsAKitU6WGgkFBZnPVffL69b8= +github.com/patrickmn/go-cache v0.0.0-20180815053127-5633e0862627/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/phyber/negroni-gzip v0.0.0-20180113114010-ef6356a5d029/go.mod h1:94RTq2fypdZCze25ZEZSjtbAQRT3cL/8EuRUqAZC/+w= +github.com/phyber/negroni-gzip v1.0.0 h1:ru1uBeaUeoAXYgZRE7RsH7ftj/t5v/hkufXv1OYbNK8= +github.com/phyber/negroni-gzip v1.0.0/go.mod h1:poOYjiFVKpeib8SnUpOgfQGStKNGLKsM8l09lOTNeyw= +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/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= +github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/shirou/gopsutil v3.21.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.22.3 h1:UebRzEomgMpv61e3hgD1tGooqX5trFbdU/ehphbHd00= +github.com/shirou/gopsutil/v3 v3.22.3/go.mod h1:D01hZJ4pVHPpCTZ3m3T2+wDF2YAGfd+H4ifUguaQzHM= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +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.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= +github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= +github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= +github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= +github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= +github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/trivago/tgo v1.0.7 h1:uaWH/XIy9aWYWpjm2CU3RpcqZXmX2ysQ9/Go+d9gyrM= +github.com/trivago/tgo v1.0.7/go.mod h1:w4dpD+3tzNIIiIfkWWa85w5/B77tlvdZckQ+6PkFnhc= +github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +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= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= +go.mongodb.org/mongo-driver v1.8.4/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= +go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= +go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= +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= 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-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201217014255-9d1352758620/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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-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/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/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/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +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-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-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +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-20211005180243-6b3c2da341f1 h1:B333XXssMuKQeBwiNODx4TupZy7bf4sxFZnN2ZOcvUE= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +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/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-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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-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-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/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-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-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-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 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.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +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-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-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-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +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-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-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-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +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= +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/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/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 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +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.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/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +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/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-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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +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/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/internal/cmd/benchmark/harness.go b/internal/cmd/benchmark/harness.go deleted file mode 100644 index 7d73469b5d..0000000000 --- a/internal/cmd/benchmark/harness.go +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import ( - "context" - "testing" - "time" - - "github.com/stretchr/testify/require" -) - -const ( - five = 5 - ten = 2 * five - hundred = ten * ten - thousand = ten * hundred - tenThousand = ten * thousand - hundredThousand = hundred * thousand - million = hundred * hundredThousand - - ExecutionTimeout = five * time.Minute - StandardRuntime = time.Minute - MinimumRuntime = five * time.Second - MinIterations = hundred -) - -type BenchCase func(context.Context, TimerManager, int) error -type BenchFunction func(*testing.B) - -func WrapCase(bench BenchCase) BenchFunction { - name := getName(bench) - return func(b *testing.B) { - ctx := context.Background() - b.ResetTimer() - b.ReportAllocs() - err := bench(ctx, b, b.N) - require.NoError(b, err, "case='%s'", name) - } -} - -func getAllCases() []*CaseDefinition { - return []*CaseDefinition{ - { - Bench: BSONFlatDocumentEncoding, - Count: tenThousand, - Size: 75310000, - Runtime: StandardRuntime, - }, - { - Bench: BSONFlatDocumentDecodingLazy, - Count: tenThousand, - Size: 75310000, - Runtime: StandardRuntime, - }, - { - Bench: BSONFlatDocumentDecoding, - Count: tenThousand, - Size: 75310000, - Runtime: StandardRuntime, - }, - { - Bench: BSONDeepDocumentEncoding, - Count: tenThousand, - Size: 19640000, - Runtime: StandardRuntime, - }, - { - Bench: BSONDeepDocumentDecodingLazy, - Count: tenThousand, - Size: 19640000, - Runtime: StandardRuntime, - }, - { - Bench: BSONDeepDocumentDecoding, - Count: tenThousand, - Size: 19640000, - Runtime: StandardRuntime, - }, - // { - // Bench: BSONFullDocumentEncoding, - // Count: tenThousand, - // Size: 57340000, - // Runtime: StandardRuntime, - // }, - // { - // Bench: BSONFullDocumentDecodingLazy, - // Count: tenThousand, - // Size: 57340000, - // Runtime: StandardRuntime, - // }, - // { - // Bench: BSONFullDocumentDecoding, - // Count: tenThousand, - // Size: 57340000, - // Runtime: StandardRuntime, - // }, - // { - // Bench: BSONFullReaderDecoding, - // Count: tenThousand, - // Size: 57340000, - // Runtime: StandardRuntime, - // }, - { - Bench: BSONFlatMapDecoding, - Count: tenThousand, - Size: 75310000, - Runtime: StandardRuntime, - }, - { - Bench: BSONFlatMapEncoding, - Count: tenThousand, - Size: 75310000, - Runtime: StandardRuntime, - }, - { - Bench: BSONDeepMapDecoding, - Count: tenThousand, - Size: 19640000, - Runtime: StandardRuntime, - }, - { - Bench: BSONDeepMapEncoding, - Count: tenThousand, - Size: 19640000, - Runtime: StandardRuntime, - }, - // { - // Bench: BSONFullMapDecoding, - // Count: tenThousand, - // Size: 57340000, - // Runtime: StandardRuntime, - // }, - // { - // Bench: BSONFullMapEncoding, - // Count: tenThousand, - // Size: 57340000, - // Runtime: StandardRuntime, - // }, - { - Bench: BSONFlatStructDecoding, - Count: tenThousand, - Size: 75310000, - Runtime: StandardRuntime, - }, - { - Bench: BSONFlatStructTagsDecoding, - Count: tenThousand, - Size: 75310000, - Runtime: StandardRuntime, - }, - { - Bench: BSONFlatStructEncoding, - Count: tenThousand, - Size: 75310000, - Runtime: StandardRuntime, - }, - { - Bench: BSONFlatStructTagsEncoding, - Count: tenThousand, - Size: 75310000, - Runtime: StandardRuntime, - }, - { - Bench: SingleRunCommand, - Count: tenThousand, - Size: 160000, - Runtime: StandardRuntime, - }, - { - Bench: SingleFindOneByID, - Count: tenThousand, - Size: 16220000, - Runtime: StandardRuntime, - }, - { - Bench: SingleInsertSmallDocument, - Count: tenThousand, - Size: 2750000, - Runtime: StandardRuntime, - }, - { - Bench: SingleInsertLargeDocument, - Count: ten, - Size: 27310890, - Runtime: StandardRuntime, - }, - { - Bench: MultiFindMany, - Count: tenThousand, - Size: 16220000, - Runtime: StandardRuntime, - }, - { - Bench: MultiInsertSmallDocument, - Count: tenThousand, - Size: 2750000, - Runtime: StandardRuntime, - }, - { - Bench: MultiInsertLargeDocument, - Count: ten, - Size: 27310890, - Runtime: StandardRuntime, - RequiredIterations: tenThousand, - }, - } -} diff --git a/internal/cmd/benchmark/harness_case.go b/internal/cmd/benchmark/harness_case.go deleted file mode 100644 index f42d82bd15..0000000000 --- a/internal/cmd/benchmark/harness_case.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import ( - "context" - "errors" - "fmt" - "path/filepath" - "reflect" - "runtime" - "strings" - "time" -) - -type CaseDefinition struct { - Bench BenchCase - Count int - Size int - RequiredIterations int - Runtime time.Duration - - cumulativeRuntime time.Duration - elapsed time.Duration - startAt time.Time - isRunning bool -} - -// TimerManager is a subset of the testing.B tool, used to manage -// setup code. -type TimerManager interface { - ResetTimer() - StartTimer() - StopTimer() -} - -func (c *CaseDefinition) ResetTimer() { - c.startAt = time.Now() - c.elapsed = 0 - c.isRunning = true -} - -func (c *CaseDefinition) StartTimer() { - c.startAt = time.Now() - c.isRunning = true -} - -func (c *CaseDefinition) StopTimer() { - if !c.isRunning { - return - } - c.elapsed += time.Since(c.startAt) - c.isRunning = false -} - -func (c *CaseDefinition) Run(ctx context.Context) *BenchResult { - out := &BenchResult{ - Trials: 1, - DataSize: c.Size, - Name: c.Name(), - Operations: c.Count, - } - var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, 2*ExecutionTimeout) - defer cancel() - - fmt.Println("=== RUN", out.Name) - if c.RequiredIterations == 0 { - c.RequiredIterations = MinIterations - } - -benchRepeat: - for { - if ctx.Err() != nil { - break - } - if c.cumulativeRuntime >= c.Runtime { - if out.Trials >= c.RequiredIterations { - break - } else if c.cumulativeRuntime >= ExecutionTimeout { - break - } - } - - res := Result{ - Iterations: c.Count, - } - - c.StartTimer() - res.Error = c.Bench(ctx, c, c.Count) - c.StopTimer() - res.Duration = c.elapsed - c.cumulativeRuntime += res.Duration - - switch { - case errors.Is(res.Error, context.DeadlineExceeded): - break benchRepeat - case errors.Is(res.Error, context.Canceled): - break benchRepeat - case res.Error == nil: - out.Trials++ - c.elapsed = 0 - out.Raw = append(out.Raw, res) - default: - continue - } - - } - - out.Duration = out.totalDuration() - fmt.Printf(" --- REPORT: count=%d trials=%d requiredTrials=%d runtime=%s\n", - c.Count, out.Trials, c.RequiredIterations, c.Runtime) - if out.HasErrors() { - fmt.Printf(" --- ERRORS: %s\n", strings.Join(out.errReport(), "\n ")) - fmt.Printf("--- FAIL: %s (%s)\n", out.Name, out.roundedRuntime()) - } else { - fmt.Printf("--- PASS: %s (%s)\n", out.Name, out.roundedRuntime()) - } - - return out - -} - -func (c *CaseDefinition) String() string { - return fmt.Sprintf("name=%s, count=%d, runtime=%s timeout=%s", - c.Name(), c.Count, c.Runtime, ExecutionTimeout) -} - -func (c *CaseDefinition) Name() string { return getName(c.Bench) } -func getName(i interface{}) string { - n := runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name() - parts := strings.Split(n, ".") - if len(parts) > 1 { - return parts[len(parts)-1] - } - - return n - -} - -func getProjectRoot() string { return filepath.Dir(getDirectoryOfFile()) } - -func getDirectoryOfFile() string { - _, file, _, _ := runtime.Caller(1) - - return filepath.Dir(file) -} diff --git a/internal/cmd/benchmark/harness_main.go b/internal/cmd/benchmark/harness_main.go deleted file mode 100644 index b618430046..0000000000 --- a/internal/cmd/benchmark/harness_main.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import ( - "context" - "encoding/json" - "flag" - "fmt" - "io/ioutil" - "os" -) - -func DriverBenchmarkMain() int { - var hasErrors bool - var outputFileName string - flag.StringVar(&outputFileName, "output", "perf.json", "path to write the 'perf.json' file") - flag.Parse() - - ctx := context.Background() - output := []interface{}{} - for _, res := range runDriverCases(ctx) { - if res.HasErrors() { - hasErrors = true - } - - evg, err := res.EvergreenPerfFormat() - if err != nil { - hasErrors = true - continue - } - - output = append(output, evg...) - } - - evgOutput, err := json.MarshalIndent(output, "", " ") - if err != nil { - return 1 - } - evgOutput = append(evgOutput, []byte("\n")...) - - if outputFileName == "" { - fmt.Println(string(evgOutput)) - } else { - // Ignore gosec warning "Expect WriteFile permissions to be 0600 or less" for benchmark - // result file. - /* #nosec G306 */ - err := ioutil.WriteFile(outputFileName, evgOutput, 0644) - if err != nil { - fmt.Fprintf(os.Stderr, "problem writing file '%s': %s", outputFileName, err.Error()) - return 1 - } - } - - if hasErrors { - return 1 - } - - return 0 -} - -func runDriverCases(ctx context.Context) []*BenchResult { - cases := getAllCases() - - results := []*BenchResult{} - for _, bc := range cases { - results = append(results, bc.Run(ctx)) - } - - return results -} diff --git a/internal/cmd/benchmark/harness_results.go b/internal/cmd/benchmark/harness_results.go deleted file mode 100644 index 2d4f2fead4..0000000000 --- a/internal/cmd/benchmark/harness_results.go +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import ( - "fmt" - "time" - - "github.com/montanaflynn/stats" -) - -type BenchResult struct { - Name string - Trials int - Duration time.Duration - Raw []Result - DataSize int - Operations int - hasErrors *bool -} - -type Metric struct { - Name string `json:"name"` - Value interface{} `json:"value"` -} - -func (r *BenchResult) EvergreenPerfFormat() ([]interface{}, error) { - timings := r.timings() - - median, err := stats.Median(timings) - if err != nil { - return nil, err - } - - min, err := stats.Min(timings) - if err != nil { - return nil, err - } - - max, err := stats.Max(timings) - if err != nil { - return nil, err - } - - out := []interface{}{ - map[string]interface{}{ - "info": map[string]interface{}{ - "test_name": r.Name + "-throughput", - "args": map[string]interface{}{ - "threads": 1, - }, - }, - "metrics": []Metric{ - {Name: "seconds", Value: r.Duration.Round(time.Millisecond).Seconds()}, - {Name: "ops_per_second", Value: r.getThroughput(median)}, - {Name: "ops_per_second_min", Value: r.getThroughput(min)}, - {Name: "ops_per_second_max", Value: r.getThroughput(max)}, - }, - }, - } - - if r.DataSize > 0 { - out = append(out, interface{}(map[string]interface{}{ - "info": map[string]interface{}{ - "test_name": r.Name + "-MB-adjusted", - "args": map[string]interface{}{ - "threads": 1, - }, - }, - "metrics": []Metric{ - {Name: "seconds", Value: r.Duration.Round(time.Millisecond).Seconds()}, - {Name: "ops_per_second", Value: r.adjustResults(median)}, - {Name: "ops_per_second_min", Value: r.adjustResults(min)}, - {Name: "ops_per_second_max", Value: r.adjustResults(max)}, - }, - })) - } - - return out, nil -} - -func (r *BenchResult) timings() []float64 { - out := []float64{} - for _, r := range r.Raw { - out = append(out, r.Duration.Seconds()) - } - return out -} - -func (r *BenchResult) totalDuration() time.Duration { - var out time.Duration - for _, trial := range r.Raw { - out += trial.Duration - } - return out -} - -func (r *BenchResult) adjustResults(data float64) float64 { return float64(r.DataSize) / data } -func (r *BenchResult) getThroughput(data float64) float64 { return float64(r.Operations) / data } -func (r *BenchResult) roundedRuntime() time.Duration { return roundDurationMS(r.Duration) } - -func (r *BenchResult) String() string { - return fmt.Sprintf("name=%s, trials=%d, secs=%s", r.Name, r.Trials, r.Duration) -} - -func (r *BenchResult) HasErrors() bool { - if r.hasErrors == nil { - var val bool - for _, res := range r.Raw { - if res.Error != nil { - val = true - break - } - } - r.hasErrors = &val - } - - return *r.hasErrors -} - -func (r *BenchResult) errReport() []string { - errs := []string{} - for _, res := range r.Raw { - if res.Error != nil { - errs = append(errs, res.Error.Error()) - } - } - return errs -} - -type Result struct { - Duration time.Duration - Iterations int - Error error -} - -func roundDurationMS(d time.Duration) time.Duration { - rounded := d.Round(time.Millisecond) - if rounded == 1<<63-1 { - return 0 - } - return rounded -} diff --git a/internal/cmd/benchmark/main.go b/internal/cmd/benchmark/main.go deleted file mode 100644 index ff87c04256..0000000000 --- a/internal/cmd/benchmark/main.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import ( - "os" -) - -func main() { - os.Exit(DriverBenchmarkMain()) -} diff --git a/internal/cmd/benchmark/multi.go b/internal/cmd/benchmark/multi.go deleted file mode 100644 index 26e6d0a6b1..0000000000 --- a/internal/cmd/benchmark/multi.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import ( - "context" - "errors" - - "go.mongodb.org/mongo-driver/v2/bson" -) - -func MultiFindMany(ctx context.Context, tm TimerManager, iters int) error { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - db, err := getClientDB() - if err != nil { - return err - } - defer func() { _ = db.Client().Disconnect(ctx) }() - - db = db.Client().Database("perftest") - if err = db.Drop(ctx); err != nil { - return err - } - - doc, err := loadSourceDocument(getProjectRoot(), perfDataDir, singleAndMultiDataDir, tweetData) - if err != nil { - return err - } - - coll := db.Collection("corpus") - - payload := make([]interface{}, iters) - for idx := range payload { - payload[idx] = doc - } - - if _, err = coll.InsertMany(ctx, payload); err != nil { - return err - } - - tm.ResetTimer() - - cursor, err := coll.Find(ctx, bson.D{}) - if err != nil { - return err - } - defer cursor.Close(ctx) - - counter := 0 - for cursor.Next(ctx) { - err = cursor.Err() - if err != nil { - return err - } - if len(cursor.Current) == 0 { - return errors.New("error retrieving document") - } - - counter++ - } - - if counter != iters { - return errors.New("problem iterating cursors") - - } - - tm.StopTimer() - - if err = cursor.Close(ctx); err != nil { - return err - } - - return db.Drop(ctx) -} - -func multiInsertCase(ctx context.Context, tm TimerManager, iters int, data string) error { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - db, err := getClientDB() - if err != nil { - return err - } - defer func() { _ = db.Client().Disconnect(ctx) }() - - db = db.Client().Database("perftest") - if err = db.Drop(ctx); err != nil { - return err - } - - doc, err := loadSourceDocument(getProjectRoot(), perfDataDir, singleAndMultiDataDir, data) - if err != nil { - return err - } - - err = db.RunCommand(ctx, bson.D{{"create", "corpus"}}).Err() - if err != nil { - return err - } - - payload := make([]interface{}, iters) - for idx := range payload { - payload[idx] = doc - } - - coll := db.Collection("corpus") - - tm.ResetTimer() - res, err := coll.InsertMany(ctx, payload) - if err != nil { - return err - } - tm.StopTimer() - - if len(res.InsertedIDs) != iters { - return errors.New("bulk operation did not complete") - } - - return db.Drop(ctx) -} - -func MultiInsertSmallDocument(ctx context.Context, tm TimerManager, iters int) error { - return multiInsertCase(ctx, tm, iters, smallData) -} - -func MultiInsertLargeDocument(ctx context.Context, tm TimerManager, iters int) error { - return multiInsertCase(ctx, tm, iters, largeData) -} diff --git a/internal/cmd/benchmark/multi_test.go b/internal/cmd/benchmark/multi_test.go deleted file mode 100644 index 83d9e27e7d..0000000000 --- a/internal/cmd/benchmark/multi_test.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import "testing" - -func BenchmarkMultiFindMany(b *testing.B) { WrapCase(MultiFindMany)(b) } -func BenchmarkMultiInsertSmallDocument(b *testing.B) { WrapCase(MultiInsertSmallDocument)(b) } -func BenchmarkMultiInsertLargeDocument(b *testing.B) { WrapCase(MultiInsertLargeDocument)(b) } diff --git a/internal/cmd/benchmark/operation_test.go b/internal/cmd/benchmark/operation_test.go deleted file mode 100644 index 7d2761bb88..0000000000 --- a/internal/cmd/benchmark/operation_test.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2022-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import ( - "context" - "testing" - - "go.mongodb.org/mongo-driver/v2/bson" - "go.mongodb.org/mongo-driver/v2/mongo" - "go.mongodb.org/mongo-driver/v2/mongo/options" -) - -var teststrings = []string{ - "hello", - "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc hendrerit nibh eu lorem scelerisque iaculis. Mauris tincidunt est quis gravida sollicitudin. Vestibulum ante dolor, semper eget finibus accumsan, finibus id nulla. Nam mauris libero, mattis sed libero at, vestibulum vehicula tellus. Nullam in finibus neque. Ut bibendum blandit condimentum. Etiam tortor mauris, tempus et accumsan a, lobortis cursus lacus. Pellentesque fermentum gravida aliquam. Donec fermentum nisi ut venenatis convallis. Praesent ultrices, justo ac fringilla eleifend, augue libero tristique quam, imperdiet rutrum lectus odio id purus. Curabitur vel metus ullamcorper massa dapibus tincidunt. Nam mollis feugiat sapien ut sagittis. Cras sed ex ligula. Etiam nec nisi diam. Pellentesque id metus molestie, tempus velit et, malesuada eros. Praesent convallis arcu et semper molestie. Morbi eu orci tempor, blandit dui egestas, faucibus diam. Aenean ac tempor justo. Donec id lectus tristique, ultrices enim sed, suscipit sapien. In arcu mauris, venenatis sed venenatis id, mollis a risus. Phasellus id massa et magna volutpat elementum in quis libero. Aliquam a aliquam erat. Nunc leo massa, sagittis at egestas vel, iaculis vitae quam. Pellentesque placerat metus id velit lobortis euismod in non sapien. Duis a quam sed elit fringilla maximus at et purus. Nullam pharetra accumsan efficitur. Integer a mattis urna. Suspendisse vehicula, nunc euismod luctus suscipit, mi mauris sollicitudin diam, porta rhoncus libero metus vitae erat. Sed lacus sem, feugiat vitae nisi at, malesuada ultricies ipsum. Quisque hendrerit posuere metus. Donec magna erat, facilisis et dictum at, tempor in leo. Maecenas luctus vestibulum quam, eu ornare ex aliquam vitae. Mauris ac mauris posuere, mattis nisl nec, fringilla libero. Nulla in ipsum ut arcu condimentum mollis. Donec viverra massa nec lacus condimentum vulputate. Nulla at dictum eros, quis sodales ante. Duis condimentum accumsan consectetur. Aenean sodales at turpis vitae efficitur. Vestibulum in diam faucibus, consequat sem ut, auctor lorem. Duis tincidunt non eros pretium rhoncus. Sed quis eros ligula. Donec vulputate ultrices enim, quis interdum dui rhoncus eu. In at mollis ex. In sed pulvinar risus. Morbi efficitur leo magna, eget bibendum leo consequat id. Pellentesque ultricies ipsum leo, sit amet cursus est bibendum a. Mauris eget porta felis. Vivamus dignissim pellentesque risus eget interdum. Mauris ultrices metus at blandit tincidunt. Duis tempor sapien vel luctus mattis. Vivamus ac orci nibh. Nam eget tempor neque. Proin lacus nibh, porttitor nec pellentesque id, dignissim et eros. Nullam et libero faucibus, iaculis mi sed, faucibus leo. In mollis sem ac porta suscipit. Ut rutrum, justo a gravida lobortis, neque nibh tincidunt mi, id eleifend dolor dolor vel arcu. Fusce vel egestas ante, eu commodo eros. Donec augue odio, bibendum ut nulla ultricies, cursus eleifend lacus. Nulla viverra ac massa vel placerat. Duis aliquam, ipsum vitae ultricies imperdiet, tellus nisl venenatis mauris, et congue elit nulla vitae est. Suspendisse volutpat ullamcorper diam, et vehicula leo bibendum at. In hac habitasse platea dictumst. Donec mattis neque a lorem ullamcorper rutrum. Curabitur mattis auctor velit, vitae iaculis mauris convallis in. Donec vulputate sapien non ex pretium semper. Vestibulum ut ligula sit amet arcu pellentesque aliquam. Pellentesque odio diam, pharetra at nunc varius, pharetra consectetur sem. Integer pretium magna pretium, mattis lectus eget, laoreet libero. Morbi dictum et dolor eu finibus. Etiam vestibulum finibus quam, vel eleifend tortor mattis viverra. Donec porttitor est vitae ligula volutpat lobortis. Donec ac semper diam. Maecenas sapien eros, blandit non velit in, faucibus auctor risus. In quam nibh, congue a nisl sit amet, tempor volutpat tortor. Curabitur dignissim auctor orci a varius. Nulla faucibus lacus libero, vitae fringilla elit facilisis id. Aliquam id elit dui. Cras convallis ligula ac leo bibendum lacinia. Duis interdum ac lectus sed tristique. Maecenas sem magna, gravida quis sapien sit amet, varius luctus ligula. Curabitur eleifend mi nibh. Suspendisse iaculis commodo justo, vitae pretium risus scelerisque non. Sed pulvinar augue nec fermentum feugiat. Nam et ligula tellus. Vestibulum euismod accumsan nibh, at rutrum est tristique sit amet. Duis porttitor ex felis, quis consectetur nunc tempor ut. Nulla vitae consequat velit, id condimentum orci. Sed lacinia velit urna, nec laoreet est varius ac. Integer dapibus libero vel bibendum posuere. Curabitur cursus est vel ante euismod dapibus. Ut hendrerit odio id rhoncus efficitur. Nam luctus sem orci, in congue ipsum ultrices at. Morbi sed tortor ut metus elementum ultrices. Cras vehicula ante magna, nec faucibus neque placerat et. Vivamus justo lacus, aliquet sit amet semper ac, porta vehicula nibh. Duis et rutrum elit. In nisi eros, fringilla ut odio eget, vehicula laoreet elit. Suspendisse potenti. Vivamus ut ultricies lacus. Integer pellentesque posuere mauris, eget aliquet purus tincidunt in. Suspendisse potenti. Nam quis purus iaculis, cursus mauris a, tempus mi. Pellentesque ullamcorper lacus vitae lacus volutpat, quis ultricies metus sagittis. Etiam imperdiet libero vitae ante cursus tempus. Nulla eu mi sodales neque scelerisque eleifend id non nisi. Maecenas blandit vitae turpis nec lacinia. Duis posuere cursus metus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridaculus mus. Ut ultrices hendrerit quam, sit amet condimentum massa finibus a. Donec et vehicula urna. Pellentesque lorem felis, fermentum vel feugiat et, congue eleifend orci. Suspendisse potenti. Sed dignissim massa at justo tristique, id feugiat neque vulputate. Pellentesque dui massa, maximus quis consequat quis, fringilla vel turpis. Etiam fermentum ex eget massa varius, a fringilla velit placerat. Sed fringilla convallis urna, ut finibus purus accumsan a. Vestibulum porttitor risus lorem, eu venenatis velit suscipit vel. Ut nec diam egestas, sollicitudin nulla sit amet, porttitor felis. Duis a nisl a ante interdum hendrerit. Integer sollicitudin scelerisque ex, et blandit magna blandit at. Vivamus a vulputate ante. Nam non tortor a lacus euismod venenatis. Vestibulum libero augue, consequat vitae turpis nec, mattis tristique nibh. Fusce pulvinar dolor vel ipsum eleifend varius. Morbi id ante eget tellus venenatis interdum non sit amet ante. Nulla luctus tempor purus, eget ultrices odio varius eget. Duis commodo eros ac molestie fermentum. Praesent vestibulum est eu massa posuere, et fermentum orci tincidunt. Duis dignissim nunc sit amet elit laoreet mollis. Aenean porttitor et nunc vel venenatis. Nunc viverra ligula nec tincidunt vehicula. Pellentesque in magna volutpat, consequat est eget, varius mauris. Maecenas in tellus eros. Aliquam erat volutpat. Phasellus blandit faucibus velit ac placerat. Donec luctus hendrerit pretium. Sed mauris purus, lobortis non erat sed, mattis ornare nulla. Fusce eu vulputate lacus. In enim justo, elementum at tortor nec, interdum semper ligula. Donec condimentum erat elit, non luctus augue rhoncus et. Quisque interdum elit dui, in vestibulum lacus aliquet et. Mauris aliquam sed ante id eleifend. Donec velit dolor, blandit et mattis non, bibendum at lorem. Nullam blandit quam sapien. Duis rutrum nunc vitae odio imperdiet condimentum. Nunc vel pellentesque purus. Cras iaculis dui est, quis cursus tortor mattis non. Donec non tincidunt lacus. Sed eget molestie lacus. Phasellus pharetra ullamcorper purus. Sed sit amet ultricies ligula, aliquam elementum velit. Cras commodo mauris vel sapien rutrum, ac pharetra libero mollis. Donec facilisis sit amet elit ac porttitor. Phasellus rutrum rhoncus sagittis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Etiam iaculis ac odio eu sodales. Proin blandit fermentum arcu efficitur ornare. Vestibulum pharetra est quis mi lobortis interdum. Proin molestie pretium viverra. Integer pellentesque eros nisi, non rutrum odio interdum ut. Quisque vel ante et mi placerat mollis ut eget eros. Etiam vitae orci lectus. Nulla scelerisque dui in dictum ornare. Aliquam vestibulum fringilla eros, id fermentum dolor euismod eget. Ut vitae massa a augue suscipit bibendum non ac mi. Pellentesque id ligula in sapien fermentum fermentum. In ut sem molestie, consectetur ex tristique, tempor risus. Maecenas scelerisque, ex eget cursus ornare, dolor nisi condimentum tellus, in venenatis nibh elit rutrum turpis. Sed sed vestibulum ex, molestie sodales leo. Vivamus cursus aliquet consequat. Aliquam et enim eget lorem placerat egestas a at justo. Praesent congue vitae purus vel scelerisque. Praesent faucibus massa felis, non porttitor dolor varius at. Nam fringilla risus sit amet faucibus vestibulum. Aliquam rhoncus ex vel magna blandit, eu dapibus felis tristique. Nam dignissim vestibulum neque vitae suscipit. Nunc a pharetra dui. Etiam nec quam sed mauris pharetra finibus in a tellus. Ut vehicula molestie lectus in pretium. Donec sit amet dui purus. Nunc in vestibulum sapien. Donec elit quam, mollis luctus gravida ac, ullamcorper quis urna. Vivamus a urna egestas velit tempor interdum non eget dui. Maecenas maximus diam at consequat dictum. Etiam sed metus quis enim faucibus cursus condimentum ut nisi. In et iaculis odio. Curabitur sollicitudin ultrices finibus. Aliquam et nisi porta, vehicula urna id, dictum turpis. Sed id iaculis justo, non semper metus. Quisque euismod, tellus iaculis sagittis vestibulum, leo magna blandit felis, non pharetra velit lacus sed nunc. Curabitur mollis porttitor odio, sed feugiat leo rhoncus quis. Duis faucibus tellus id venenatis vestibulum. Duis interdum pretium cursus. Integer sed iaculis mi. Phasellus at odio at felis fermentum congue. Morbi at ante ut lacus posuere accumsan quis in orci. Nullam eget sapien eu nibh venenatis malesuada. Nulla sed ligula et metus mattis placerat sed eget nisl. Nunc cursus et nulla id dictum. Vivamus efficitur aliquam. ", -} - -func BenchmarkClientWrite(b *testing.B) { - benchmarks := []struct { - name string - opt *options.ClientOptionsBuilder - }{ - {name: "not compressed", opt: options.Client().ApplyURI("mongodb://localhost:27017")}, - {name: "snappy", opt: options.Client().ApplyURI("mongodb://localhost:27017").SetCompressors([]string{"snappy"})}, - {name: "zlib", opt: options.Client().ApplyURI("mongodb://localhost:27017").SetCompressors([]string{"zlib"})}, - {name: "zstd", opt: options.Client().ApplyURI("mongodb://localhost:27017").SetCompressors([]string{"zstd"})}, - } - for _, bm := range benchmarks { - b.Run(bm.name, func(b *testing.B) { - client, err := mongo.Connect(bm.opt) - if err != nil { - b.Fatalf("error creating client: %v", err) - } - defer func() { _ = client.Disconnect(context.Background()) }() - coll := client.Database("test").Collection("test") - _, err = coll.DeleteMany(context.Background(), bson.D{}) - if err != nil { - b.Fatalf("error deleting the document: %v", err) - } - - b.ResetTimer() - b.RunParallel(func(p *testing.PB) { - var cnt int - for p.Next() { - cnt = (cnt + 1) % len(teststrings) - _, err = coll.InsertOne(context.Background(), bson.D{{"text", teststrings[cnt]}}) - if err != nil { - b.Fatalf("error inserting one document: %v", err) - } - } - }) - _, _ = coll.DeleteMany(context.Background(), bson.D{}) - }) - } -} - -func BenchmarkClientBulkWrite(b *testing.B) { - benchmarks := []struct { - name string - opt *options.ClientOptionsBuilder - }{ - {name: "not compressed", opt: options.Client().ApplyURI("mongodb://localhost:27017")}, - {name: "snappy", opt: options.Client().ApplyURI("mongodb://localhost:27017").SetCompressors([]string{"snappy"})}, - {name: "zlib", opt: options.Client().ApplyURI("mongodb://localhost:27017").SetCompressors([]string{"zlib"})}, - {name: "zstd", opt: options.Client().ApplyURI("mongodb://localhost:27017").SetCompressors([]string{"zstd"})}, - } - for _, bm := range benchmarks { - b.Run(bm.name, func(b *testing.B) { - client, err := mongo.Connect(bm.opt) - if err != nil { - b.Fatalf("error creating client: %v", err) - } - defer func() { _ = client.Disconnect(context.Background()) }() - coll := client.Database("test").Collection("test") - _, err = coll.DeleteMany(context.Background(), bson.D{}) - if err != nil { - b.Fatalf("error deleting the document: %v", err) - } - - b.ResetTimer() - b.RunParallel(func(p *testing.PB) { - var cnt int - for p.Next() { - cnt = (cnt + 1) % len(teststrings) - _, err = coll.BulkWrite(context.Background(), []mongo.WriteModel{ - mongo.NewInsertOneModel().SetDocument(bson.D{{"text", teststrings[cnt]}}), - mongo.NewInsertOneModel().SetDocument(bson.D{{"text", teststrings[cnt]}}), - mongo.NewInsertOneModel().SetDocument(bson.D{{"text", teststrings[cnt]}}), - mongo.NewInsertOneModel().SetDocument(bson.D{{"text", teststrings[cnt]}}), - }) - if err != nil { - b.Fatalf("error inserting one document: %v", err) - } - } - }) - _, _ = coll.DeleteMany(context.Background(), bson.D{}) - }) - } -} - -func BenchmarkClientRead(b *testing.B) { - benchmarks := []struct { - name string - opt *options.ClientOptionsBuilder - }{ - {name: "not compressed", opt: options.Client().ApplyURI("mongodb://localhost:27017")}, - {name: "snappy", opt: options.Client().ApplyURI("mongodb://localhost:27017").SetCompressors([]string{"snappy"})}, - {name: "zlib", opt: options.Client().ApplyURI("mongodb://localhost:27017").SetCompressors([]string{"zlib"})}, - {name: "zstd", opt: options.Client().ApplyURI("mongodb://localhost:27017").SetCompressors([]string{"zstd"})}, - } - for _, bm := range benchmarks { - b.Run(bm.name, func(b *testing.B) { - client, err := mongo.Connect(bm.opt) - if err != nil { - b.Fatalf("error creating client: %v", err) - } - defer func() { _ = client.Disconnect(context.Background()) }() - coll := client.Database("test").Collection("test") - _, err = coll.DeleteMany(context.Background(), bson.D{}) - if err != nil { - b.Fatalf("error deleting the document: %v", err) - } - for i, text := range teststrings { - _, err = coll.InsertOne(context.Background(), bson.D{{"_id", i}, {"text", text}}) - if err != nil { - b.Fatalf("error inserting one document: %v", err) - } - } - - b.ResetTimer() - b.RunParallel(func(p *testing.PB) { - var cnt int - for p.Next() { - cnt = (cnt + 1) % len(teststrings) - var res bson.D - err = coll.FindOne(context.Background(), bson.M{"_id": cnt}).Decode(&res) - if err != nil { - b.Errorf("error finding one document: %v", err) - } - } - }) - }) - } -} diff --git a/internal/cmd/benchmark/single.go b/internal/cmd/benchmark/single.go deleted file mode 100644 index eeb61070ee..0000000000 --- a/internal/cmd/benchmark/single.go +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import ( - "context" - "errors" - "fmt" - "os" - "strings" - - "go.mongodb.org/mongo-driver/v2/bson" - "go.mongodb.org/mongo-driver/v2/mongo" - "go.mongodb.org/mongo-driver/v2/mongo/options" - "go.mongodb.org/mongo-driver/v2/x/mongo/driver/connstring" -) - -// LegacyHelloLowercase is the lowercase, legacy version of the hello command. -var LegacyHelloLowercase = "ismaster" - -const ( - singleAndMultiDataDir = "single_and_multi_document" - tweetData = "tweet.json" - smallData = "small_doc.json" - largeData = "large_doc.json" -) - -// AddOptionsToURI appends connection string options to a URI. -func AddOptionsToURI(uri string, opts ...string) string { - if !strings.ContainsRune(uri, '?') { - if uri[len(uri)-1] != '/' { - uri += "/" - } - - uri += "?" - } else { - uri += "&" - } - - for _, opt := range opts { - uri += opt - } - - return uri -} - -// AddTLSConfigToURI checks for the environmental variable indicating that the tests are being run -// on an SSL-enabled server, and if so, returns a new URI with the necessary configuration. -func AddTLSConfigToURI(uri string) string { - caFile := os.Getenv("MONGO_GO_DRIVER_CA_FILE") - if len(caFile) == 0 { - return uri - } - - return AddOptionsToURI(uri, "ssl=true&sslCertificateAuthorityFile=", caFile) -} - -func GetConnString() (*connstring.ConnString, error) { - mongodbURI := os.Getenv("MONGODB_URI") - if mongodbURI == "" { - mongodbURI = "mongodb://localhost:27017" - } - - mongodbURI = AddTLSConfigToURI(mongodbURI) - - cs, err := connstring.ParseAndValidate(mongodbURI) - if err != nil { - return nil, err - } - - return cs, nil -} - -func GetDBName(cs *connstring.ConnString) string { - if cs.Database != "" { - return cs.Database - } - - return fmt.Sprintf("mongo-go-driver-%d", os.Getpid()) -} - -func getClientDB() (*mongo.Database, error) { - cs, err := GetConnString() - if err != nil { - return nil, err - } - client, err := mongo.Connect(options.Client().ApplyURI(cs.String())) - if err != nil { - return nil, err - } - - db := client.Database(GetDBName(cs)) - return db, nil -} - -func SingleRunCommand(ctx context.Context, tm TimerManager, iters int) error { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - db, err := getClientDB() - if err != nil { - return err - } - defer func() { _ = db.Client().Disconnect(ctx) }() - - cmd := bson.D{{LegacyHelloLowercase, true}} - - tm.ResetTimer() - for i := 0; i < iters; i++ { - var doc bson.D - err := db.RunCommand(ctx, cmd).Decode(&doc) - if err != nil { - return err - } - // read the document and then throw it away to prevent - out, err := bson.Marshal(doc) - if err != nil { - return err - } - if len(out) == 0 { - return errors.New("output of command is empty") - } - } - tm.StopTimer() - - return nil -} - -func SingleFindOneByID(ctx context.Context, tm TimerManager, iters int) error { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - db, err := getClientDB() - if err != nil { - return err - } - - db = db.Client().Database("perftest") - if err = db.Drop(ctx); err != nil { - return err - } - - doc, err := loadSourceDocument(getProjectRoot(), perfDataDir, singleAndMultiDataDir, tweetData) - if err != nil { - return err - } - coll := db.Collection("corpus") - - for i := 0; i < iters; i++ { - idDoc := make(bson.D, 0, len(doc)+1) - idDoc = append(idDoc, bson.E{"_id", i}) - idDoc = append(idDoc, doc...) - res, err := coll.InsertOne(ctx, idDoc) - if err != nil { - return err - } - if res.InsertedID == nil { - return errors.New("no inserted ID returned") - } - } - - tm.ResetTimer() - - for i := 0; i < iters; i++ { - var res bson.D - err := coll.FindOne(ctx, bson.D{{"_id", i}}).Decode(&res) - if err != nil { - return err - } - } - - tm.StopTimer() - - return db.Drop(ctx) -} - -func singleInsertCase(ctx context.Context, tm TimerManager, iters int, data string) error { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - db, err := getClientDB() - if err != nil { - return err - } - defer func() { _ = db.Client().Disconnect(ctx) }() - - db = db.Client().Database("perftest") - if err = db.Drop(ctx); err != nil { - return err - } - - doc, err := loadSourceDocument(getProjectRoot(), perfDataDir, singleAndMultiDataDir, data) - if err != nil { - return err - } - - err = db.RunCommand(ctx, bson.D{{"create", "corpus"}}).Err() - if err != nil { - return err - } - - coll := db.Collection("corpus") - - tm.ResetTimer() - - for i := 0; i < iters; i++ { - if _, err = coll.InsertOne(ctx, doc); err != nil { - return err - } - } - - tm.StopTimer() - - return db.Drop(ctx) -} - -func SingleInsertSmallDocument(ctx context.Context, tm TimerManager, iters int) error { - return singleInsertCase(ctx, tm, iters, smallData) -} - -func SingleInsertLargeDocument(ctx context.Context, tm TimerManager, iters int) error { - return singleInsertCase(ctx, tm, iters, largeData) -} diff --git a/internal/cmd/benchmark/single_test.go b/internal/cmd/benchmark/single_test.go deleted file mode 100644 index c28f1957e7..0000000000 --- a/internal/cmd/benchmark/single_test.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (C) MongoDB, Inc. 2017-present. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -package main - -import "testing" - -func BenchmarkSingleRunCommand(b *testing.B) { WrapCase(SingleRunCommand)(b) } -func BenchmarkSingleFindOneByID(b *testing.B) { WrapCase(SingleFindOneByID)(b) } -func BenchmarkSingleInsertSmallDocument(b *testing.B) { WrapCase(SingleInsertSmallDocument)(b) } -func BenchmarkSingleInsertLargeDocument(b *testing.B) { WrapCase(SingleInsertLargeDocument)(b) }