...
1
2
3
4
5
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