...

Source file src/go.mongodb.org/mongo-driver/benchmark/multi.go

Documentation: go.mongodb.org/mongo-driver/benchmark

     1  // Copyright (C) MongoDB, Inc. 2017-present.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License"); you may
     4  // not use this file except in compliance with the License. You may obtain
     5  // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
     6  
     7  package benchmark
     8  
     9  import (
    10  	"context"
    11  	"errors"
    12  
    13  	"go.mongodb.org/mongo-driver/bson"
    14  )
    15  
    16  func MultiFindMany(ctx context.Context, tm TimerManager, iters int) error {
    17  	ctx, cancel := context.WithCancel(ctx)
    18  	defer cancel()
    19  
    20  	db, err := getClientDB(ctx)
    21  	if err != nil {
    22  		return err
    23  	}
    24  	defer func() { _ = db.Client().Disconnect(ctx) }()
    25  
    26  	db = db.Client().Database("perftest")
    27  	if err = db.Drop(ctx); err != nil {
    28  		return err
    29  	}
    30  
    31  	doc, err := loadSourceDocument(getProjectRoot(), perfDataDir, singleAndMultiDataDir, tweetData)
    32  	if err != nil {
    33  		return err
    34  	}
    35  
    36  	coll := db.Collection("corpus")
    37  
    38  	payload := make([]interface{}, iters)
    39  	for idx := range payload {
    40  		payload[idx] = doc
    41  	}
    42  
    43  	if _, err = coll.InsertMany(ctx, payload); err != nil {
    44  		return err
    45  	}
    46  
    47  	tm.ResetTimer()
    48  
    49  	cursor, err := coll.Find(ctx, bson.D{})
    50  	if err != nil {
    51  		return err
    52  	}
    53  	defer cursor.Close(ctx)
    54  
    55  	counter := 0
    56  	for cursor.Next(ctx) {
    57  		err = cursor.Err()
    58  		if err != nil {
    59  			return err
    60  		}
    61  		if len(cursor.Current) == 0 {
    62  			return errors.New("error retrieving document")
    63  		}
    64  
    65  		counter++
    66  	}
    67  
    68  	if counter != iters {
    69  		return errors.New("problem iterating cursors")
    70  
    71  	}
    72  
    73  	tm.StopTimer()
    74  
    75  	if err = cursor.Close(ctx); err != nil {
    76  		return err
    77  	}
    78  
    79  	return db.Drop(ctx)
    80  }
    81  
    82  func multiInsertCase(ctx context.Context, tm TimerManager, iters int, data string) error {
    83  	ctx, cancel := context.WithCancel(ctx)
    84  	defer cancel()
    85  
    86  	db, err := getClientDB(ctx)
    87  	if err != nil {
    88  		return err
    89  	}
    90  	defer func() { _ = db.Client().Disconnect(ctx) }()
    91  
    92  	db = db.Client().Database("perftest")
    93  	if err = db.Drop(ctx); err != nil {
    94  		return err
    95  	}
    96  
    97  	doc, err := loadSourceDocument(getProjectRoot(), perfDataDir, singleAndMultiDataDir, data)
    98  	if err != nil {
    99  		return err
   100  	}
   101  
   102  	err = db.RunCommand(ctx, bson.D{{"create", "corpus"}}).Err()
   103  	if err != nil {
   104  		return err
   105  	}
   106  
   107  	payload := make([]interface{}, iters)
   108  	for idx := range payload {
   109  		payload[idx] = doc
   110  	}
   111  
   112  	coll := db.Collection("corpus")
   113  
   114  	tm.ResetTimer()
   115  	res, err := coll.InsertMany(ctx, payload)
   116  	if err != nil {
   117  		return err
   118  	}
   119  	tm.StopTimer()
   120  
   121  	if len(res.InsertedIDs) != iters {
   122  		return errors.New("bulk operation did not complete")
   123  	}
   124  
   125  	return db.Drop(ctx)
   126  }
   127  
   128  func MultiInsertSmallDocument(ctx context.Context, tm TimerManager, iters int) error {
   129  	return multiInsertCase(ctx, tm, iters, smallData)
   130  }
   131  
   132  func MultiInsertLargeDocument(ctx context.Context, tm TimerManager, iters int) error {
   133  	return multiInsertCase(ctx, tm, iters, largeData)
   134  }
   135  

View as plain text