123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- // 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 benchmark
- import (
- "context"
- "errors"
- "go.mongodb.org/mongo-driver/x/bsonx"
- )
- func MultiFindMany(ctx context.Context, tm TimerManager, iters int) error {
- ctx, cancel := context.WithCancel(ctx)
- defer cancel()
- db, err := getClientDB(ctx)
- if err != nil {
- return err
- }
- defer 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, bsonx.Doc{})
- 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
- }
- if err = db.Drop(ctx); err != nil {
- return err
- }
- return nil
- }
- func multiInsertCase(ctx context.Context, tm TimerManager, iters int, data string) error {
- ctx, cancel := context.WithCancel(ctx)
- defer cancel()
- db, err := getClientDB(ctx)
- if err != nil {
- return err
- }
- defer 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, bsonx.Doc{{"create", bsonx.String("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")
- }
- if err = db.Drop(ctx); err != nil {
- return err
- }
- return nil
- }
- 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)
- }
|