Skip to content

Commit 33ef340

Browse files
committed
Merge branch 'feature/benchmarks' into develop
Conflicts: session.go
2 parents 600ecc8 + 641c69e commit 33ef340

File tree

5 files changed

+194
-12
lines changed

5 files changed

+194
-12
lines changed

connection.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,7 @@ func (c *Connection) SendQuery(s *Session, q Query, opts map[string]interface{},
185185
}
186186

187187
// Return immediately if the noreply option was set
188-
if noreply, ok := opts["noreply"]; ok && noreply.(bool) {
189-
c.Close()
190-
return nil, nil
191-
} else if async {
188+
if noreply, ok := opts["noreply"]; (ok && noreply.(bool)) || async {
192189
return nil, nil
193190
}
194191

gorethink_test.go

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ package gorethink
33
import (
44
"encoding/json"
55
"flag"
6+
"math/rand"
67
"os"
8+
"runtime"
9+
"sync"
710
"testing"
811
"time"
912

@@ -203,3 +206,181 @@ var str T = T{
203206
},
204207
},
205208
}
209+
210+
func (s *RethinkSuite) BenchmarkExpr(c *test.C) {
211+
for i := 0; i < c.N; i++ {
212+
// Test query
213+
query := Expr(true)
214+
err := query.Exec(sess)
215+
c.Assert(err, test.IsNil)
216+
}
217+
}
218+
219+
func (s *RethinkSuite) BenchmarkNoReplyExpr(c *test.C) {
220+
for i := 0; i < c.N; i++ {
221+
// Test query
222+
query := Expr(true)
223+
err := query.Exec(sess, RunOpts{NoReply: true})
224+
c.Assert(err, test.IsNil)
225+
}
226+
}
227+
228+
func (s *RethinkSuite) BenchmarkGet(c *test.C) {
229+
// Ensure table + database exist
230+
DbCreate("test").RunWrite(sess)
231+
Db("test").TableCreate("TestMany").RunWrite(sess)
232+
Db("test").Table("TestMany").Delete().RunWrite(sess)
233+
234+
// Insert rows
235+
data := []interface{}{}
236+
for i := 0; i < 100; i++ {
237+
data = append(data, map[string]interface{}{
238+
"id": i,
239+
})
240+
}
241+
Db("test").Table("TestMany").Insert(data).Run(sess)
242+
243+
for i := 0; i < c.N; i++ {
244+
n := rand.Intn(100)
245+
246+
// Test query
247+
var response interface{}
248+
query := Db("test").Table("TestMany").Get(n)
249+
res, err := query.Run(sess)
250+
c.Assert(err, test.IsNil)
251+
252+
err = res.One(&response)
253+
254+
c.Assert(err, test.IsNil)
255+
c.Assert(response, JsonEquals, map[string]interface{}{"id": n})
256+
}
257+
}
258+
259+
func (s *RethinkSuite) BenchmarkGetStruct(c *test.C) {
260+
// Ensure table + database exist
261+
DbCreate("test").RunWrite(sess)
262+
Db("test").TableCreate("TestMany").RunWrite(sess)
263+
Db("test").Table("TestMany").Delete().RunWrite(sess)
264+
265+
// Insert rows
266+
data := []interface{}{}
267+
for i := 0; i < 100; i++ {
268+
data = append(data, map[string]interface{}{
269+
"id": i,
270+
"name": "Object 1",
271+
"Attrs": []interface{}{map[string]interface{}{
272+
"Name": "attr 1",
273+
"Value": "value 1",
274+
}},
275+
})
276+
}
277+
Db("test").Table("TestMany").Insert(data).Run(sess)
278+
279+
for i := 0; i < c.N; i++ {
280+
n := rand.Intn(100)
281+
282+
// Test query
283+
var resObj object
284+
query := Db("test").Table("TestMany").Get(n)
285+
res, err := query.Run(sess)
286+
c.Assert(err, test.IsNil)
287+
288+
err = res.One(&resObj)
289+
290+
c.Assert(err, test.IsNil)
291+
}
292+
}
293+
294+
func (s *RethinkSuite) BenchmarkSelectMany(c *test.C) {
295+
// Ensure table + database exist
296+
DbCreate("test").RunWrite(sess)
297+
Db("test").TableCreate("TestMany").RunWrite(sess)
298+
Db("test").Table("TestMany").Delete().RunWrite(sess)
299+
300+
// Insert rows
301+
data := []interface{}{}
302+
for i := 0; i < 100; i++ {
303+
data = append(data, map[string]interface{}{
304+
"id": i,
305+
})
306+
}
307+
Db("test").Table("TestMany").Insert(data).Run(sess)
308+
309+
for i := 0; i < c.N; i++ {
310+
// Test query
311+
res, err := Db("test").Table("TestMany").Run(sess)
312+
c.Assert(err, test.IsNil)
313+
314+
var response []map[string]interface{}
315+
err = res.All(&response)
316+
317+
c.Assert(err, test.IsNil)
318+
c.Assert(response, test.HasLen, 100)
319+
}
320+
}
321+
322+
func (s *RethinkSuite) BenchmarkSelectManyStruct(c *test.C) {
323+
// Ensure table + database exist
324+
DbCreate("test").RunWrite(sess)
325+
Db("test").TableCreate("TestMany").RunWrite(sess)
326+
Db("test").Table("TestMany").Delete().RunWrite(sess)
327+
328+
// Insert rows
329+
data := []interface{}{}
330+
for i := 0; i < 100; i++ {
331+
data = append(data, map[string]interface{}{
332+
"id": i,
333+
"name": "Object 1",
334+
"Attrs": []interface{}{map[string]interface{}{
335+
"Name": "attr 1",
336+
"Value": "value 1",
337+
}},
338+
})
339+
}
340+
Db("test").Table("TestMany").Insert(data).Run(sess)
341+
342+
for i := 0; i < c.N; i++ {
343+
// Test query
344+
res, err := Db("test").Table("TestMany").Run(sess)
345+
c.Assert(err, test.IsNil)
346+
347+
var response []object
348+
err = res.All(&response)
349+
350+
c.Assert(err, test.IsNil)
351+
c.Assert(response, test.HasLen, 100)
352+
}
353+
}
354+
355+
func doConcurrentTest(c *test.C, ct func()) {
356+
maxProcs, numReqs := 1, 150
357+
if testing.Short() {
358+
maxProcs, numReqs = 4, 50
359+
}
360+
defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(maxProcs))
361+
362+
var wg sync.WaitGroup
363+
wg.Add(numReqs)
364+
365+
reqs := make(chan bool)
366+
defer close(reqs)
367+
368+
for i := 0; i < maxProcs*2; i++ {
369+
go func() {
370+
for _ = range reqs {
371+
ct()
372+
if c.Failed() {
373+
wg.Done()
374+
continue
375+
}
376+
wg.Done()
377+
}
378+
}()
379+
}
380+
381+
for i := 0; i < numReqs; i++ {
382+
reqs <- true
383+
}
384+
385+
wg.Wait()
386+
}

query.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,14 +164,18 @@ func (t Term) RunWrite(s *Session, optArgs ...RunOpts) (WriteResponse, error) {
164164

165165
// Exec runs the query but does not return the result.
166166
func (t Term) Exec(s *Session, optArgs ...RunOpts) error {
167-
res, err := t.Run(s, optArgs...)
168-
if err != nil {
169-
return err
170-
}
171-
err = res.Close()
167+
_, err := t.Run(s, optArgs...)
172168
if err != nil {
173169
return err
174170
}
171+
// if res == nil {
172+
// return nil
173+
// }
174+
175+
// err = res.Close()
176+
// if err != nil {
177+
// return err
178+
// }
175179

176180
return nil
177181
}

query_select_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ func (s *RethinkSuite) TestSelectMany(c *test.C) {
305305
c.Assert(n, test.Equals, 100)
306306
}
307307

308-
func (s *RethinkSuite) TestSelectManyConcurrent(c *test.C) {
308+
func (s *RethinkSuite) TestConcurrentSelectMany(c *test.C) {
309309
// Ensure table + database exist
310310
DbCreate("test").RunWrite(sess)
311311
Db("test").TableCreate("TestMany").RunWrite(sess)
@@ -326,7 +326,7 @@ func (s *RethinkSuite) TestSelectManyConcurrent(c *test.C) {
326326
}
327327

328328
// Test queries concurrently
329-
attempts := 1
329+
attempts := 10
330330
waitChannel := make(chan error, attempts)
331331

332332
for i := 0; i < attempts; i++ {

session.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ func (s *Session) Reconnect(optArgs ...CloseOpts) error {
154154
return err
155155
}
156156

157+
s.pool = cp
157158
}
158159

159160
// Check the connection
@@ -346,7 +347,6 @@ func (s *Session) noreplyWaitQuery() error {
346347

347348
return nil
348349
}
349-
350350
func (s *Session) getConn() (Connection, error) {
351351
c, err := s.pool.Get()
352352
if err != nil {

0 commit comments

Comments
 (0)